Навигация > Блог / SQL инъекции / Blog article: Blind SQL + Benchmark (Sleep)

| Подписаться на RSS

Blind SQL + Benchmark (Sleep)

Январь 22nd, 2010 Опубликовано в SQL инъекции

Не уверен, что этот метод может быть где либо полезным, поэтому просто публикую как исследование ради исследований, может кто усовершенствует или найдёт СУБД, для которой подобное будет актуально.

Допустим у нас есть слепая скуля (но такая, что хоть какой-то вывод возможен), на что можем влиять:


страничка:
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 запроса. (По теории вероятности бенчмарк сработает лишь на половине из них, т.е. в принципе работать должно быстро)

Теперь практика.

Запрос, к БД реализующий логику (на примере MySQL):

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, чтобы ошибка появилась только после его выполнения. (Это первое что пришло в голову, может есть методы лучше)

Скрипт дёргающий хеш по этому алгоритму: скачать.

В примере алфавит задан статически, дёргается только 16 символов, а не 32, также очень высокое значение бенчмарка (для точности тестов, хотя уменьшив значения в 2 раза, вывод остался корректным) и неэлегантно написаный код. Ясно что для практического использования его нужно модифицировать + BENCHMARK заменить на SLEEP, если версия БД позволяет.

З.Ы.
Ну и что касается практики – метод в общем случае работает дольше чем при обычном бинарном поиске, хоть и отправляет меньше запросов. Так же очевидно то, что провоцировать ошибку совершенно не обязательно, достаточно вернуть любой другой ID.

3 ответа(ов) на “Blind SQL + Benchmark (Sleep)”

  1. Root-access ответил:

    Насчёт этого:
    3) Вычисляем при помощи find_in_set номер группы к которой принадлежит данный символ, кодируем его согласно таблице выше

    Если ветка <5, можно заменить конструкцией с BETWEEN … AND …


  2. ....... ответил:

    Квазар, пиши больше, мы тебя молча читаем…) кстати привет


  3. satana-fu ответил:

    Warning: require(ABSPATHWPINC/class.wp-dependencies.php) [function.require]: failed to open stream: No such file or directory in /var/www/qwazar/data/www/qwazar.ru/wp-includes/script-loader.php on line 25

    Fatal error: require() [function.require]: Failed opening required ‘ABSPATHWPINC/class.wp-dependencies.php’ (include_path=’.:/usr/share/php:/usr/share/pear’) in /var/www/qwazar/data/www/qwazar.ru/wp-includes/script-loader.php on line 25


Оставить ответ

  • О блоге

    Блог предназначен для публикации всяких разных записок технического плана. Буду стараться делать упор на собственные исследования, и всё то что мне покажется интересным.
  • Мета