Не знаю писал об этом кто-то раньше или нет, идея в общем то очевидная...
Для начала напомню суть Blind SQL - к примеру у нас есть уязвимый сайт, на лицо инъекция, но использовать
классический UNION SELECT мы не можем, так как в скрипте, к примеру, используються несколько последовательно идущих запросов с разным количеством колонок, в которые приходит наш уязвимый параметр. Чтобы получить данные из базы в этом случае обычно используеться конструкция
AND c посимвольным перебором значений:
Код:
Подбор имени первой несистемной таблицы:
index.php?id=113+
AND+1=ASCII(LOWER(SUBSTRING(
SELECT table_name FROM+information_schema.tables LIMIT 18,1),N,1))=0xXX/*
(ну понятно, N - позиция символа, 0xXX - значение)
То есть у нас есть только 2 варианта - либо символ подходит либо нет. Так же при проведении слепых инъекций обычно используют алгоритм бинарного поиска. Те перебор идет не тупо по байтам, а методом проверки вхождения перебираемого символа в диапазон, с последующим его сужением.
Еще одна полезная констукция - IN:
Код:
Проверяем существование таблиц из списка
index.php?id=113+
AND+1=
(select 1 from information_schema.tables
where table_name in ('administrators','admins','user')
Данная атака имеет существенный недостаток - для ее реализации необходимо послать серверу большое число запросов, что может привлечь внимание админа, а слишком частые запросы могут быть расценены сервером как DOS.
Но почему бы нам не использовать в качестве выводимого результата "родные" ID скрипта? Допустим у нас есть новостной сайт - с уязвимым параметром news_id. Сопоставив каждому варианту ид новости мы сможем возвращать более 2 вариантов, сократив таким образом количество запросов:
Код:
?news.php?news_id=
(select 111 from information_schema.tables where table_name = 'administrators'
union select 112 from information_schema.tables where table_name = 'admins'
union select 113 from information_schema.tables where table_name = 'users')
После чего парсим заголовки новостей и получаем наше значение.