Эвристика на службе у sqlmap

Эвристика на службе у sqlmap

эвристика_sqlmap

Уязвимые к SQL-инъекции веб-приложения часто сконфигурированы так, что выводят пользователю все сообщения об ошибках (например, при включенной опции display_errors в настройках РНР). Если отправить недопустимое значение параметра (например, поставить кавычку или () ) веб-приложение ответит подробным сообщением об ошибке СУБД.
 Sqlmap использует этот вид эвристики для нескольких целей.

Первая проверка позволяет понять, какой сервер СУБД используется. Например, в случае если сервер возвращает ответ:
«SQL error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near…!»
то sqlmap делает вывод, что он имеет дело с MySQL. С этого момента будут проводиться только MySQL-ориентированные тесты, причем фильтр будет работать как для тестов на более высоком уровне (опция —level), так и для расширенных наборов тестов (опция —risk).

В случае проверки сразу нескольких URL (ключ -т), если задать опцию —smart, sqlmap быстренько просмотрит каждый адрес и выполнит подробное тестирование только тех, которые положительно «откликнутся» на эту эвристическую проверку (будут вызывать сообщение об ошибке СУБД). Таким образом sqlmap может найти потенциальную цель в течение нескольких минут.

sqlmap_smart_go

Вторая эвристическая проверка SQL-инъекции проводится на параметрах, принимающих целочисленные значения.
Когда параметр является динамическим (то есть с изменением его значения меняется ответ веб-сервера), а ответ оказывается одинаковым как для арифметической операции (например, id=1183-1182), так и для первоначального значения (id=l), sqlmap предупредит пользователя о том, что обрабатываемый параметр, скорее всего, склонен к SQL-инъекции.

Это делается главным образом для уведомления юзера, чтобы в случае, если sqlmap не сможет найти подходящую технику эксплуатации, пользователь продолжил и провел несколько дополнительных тестов.
Например, если используется какой-то механизм защиты, нахождение метода его обхода в виде скрипта, обфусцирующего отправляемый payload (опция —tamper=between), может означать разницу между успехом и неудачей.

sqlmap-tamper_in_acttion

Третья эвристическая проверка делается в том случае, если сообщения об ошибках в СУБД выключены и обнаружена по крайней мере одна общая (не зависящая от СУБД) техника SQL-инъекции (например, generic boolean-based blind). Тогда для каждой из поддерживаемых СУБД отсылается один запрос в форме, поддерживаемой только конкретно ею (например, в случае MySQL id=l AND (SELECT 0x41597548)=0x41597548)).
Если пришедший ответ совпал с ожидаемым, то sqlmap делает вывод, что СУБД идентифицирована, и проводит дальнейшие тесты только для нее, как и в случае первой проверки.

 ВЫЯВЛЯЕМ ПРИВЕДЕНИЕ ТИПОВ

В некоторых случаях веб-приложения используют явное приведение типов для предотвращения SQL-инъекций. Это особенно заметно на целочисленных значениях параметров (например, id=l).
Если при изменении этого целочисленного параметра сервер возвращает разные ответы, а при добавлении к нему произвольной строки (например, id=lvHxr) возвращается то же самое значение, мы можем с большой уверенностью сказать, что используется приведение типов.
В таких случаях sqlmap предупреждает пользователя сообщением и просит выбрать, хочет ли он удалить текущий параметр из дальнейших испытаний и тем самым сохранить время сканирования. Это особенно полезно, когда пользователь не уверен, следует ли ему провести более детальные тесты на данном параметре или просто пропустить его и начать тестировать другие.

sqlmap_img

 ОТЛАВЛИВАЕМ ОГРАНИЧЕНИЕ НА ДЛИНУ СТРОКИ

Suhosin — популярный патч с открытым кодом, используемый для защиты серверов и пользователей от известных и неизвестных брешей в РНР-приложениях и ядре языка РНР. И хотя он не предлагает явной защиты от SQL-инъекций, но накладывает ограничение на длину значений параметров запроса (например, ограничивает длину значений параметров GET-запроса 512 символами). Это создает проблемы при проведении SQL-инъекций в случаях, когда используются более длинные payload’bi (например, инжект РНР-шелла через оператор SELECT .. INTO OUTFILE).
После того как SQL-инъекция успешно идентифицирована, sqlmap посылает один длинный запрос, содержащий простой логический вопрос (например, 3182=3182). Если веб-сервер не отвечает в нужной форме (например, пустым ответом), мы можем быть уверены, что на вебсервере имеется какой-то механизм ограничения длины, например такой же, как уже упомянутый патч Suhosin.
В таких случаях sqlmap предупреждает пользователя, что в дальнейшей работе его ожидают проблемы. Единственное, чем можно воспользоваться в данном случае, чтобы попытаться избежать этой проблемы, — это отключить в sqlmap механизм экранирования строк (где, например, запросы типа SELECT ‘foobar’ для MySQL превращаются в SELECT 0X666F6F626172), используя ключ —no-escape.

Смотрите так же   IP Tracker (PHP + MySQL)

Таким образом, payload’ы станут более короткими, но при этом мы рискуем тем, что одинарные кавычки (‘) могут быть экранированы (например, с помощью РНР-функции mysql_real_escape_ string), а полезные нагрузки станут более заметными в логах веб-сервера.

 ОБНАРУЖЕНИЕ WAF

WAF-продукты (web application firewall — брандмауэр для веб-приложений) — широко используемый механизм для предотвращения злонамеренных атак на веб-приложения.
Каждый из них может быть опознан как с помощью уникального ответа на обнаруженную атаку, так и через вставку конкретного HTTP-заголовка (заголовков). Например, ModSecurity возвращает 501 HTTP код ошибки при обнаружении атаки, в то время как F5 BIG-IP добавляет свой собственный X-Cnection HTTP заголовок в ответ.

Sqlmap включает в себя функции обнаружения (ключ —check-WAF) и распознавания (ключ —identify-WAF) около 30 различных WAF (таких как Airlock, Barracuda и другие).
Для обнаружения работы веб-файрвола используется намеренно созданный подозрительный SQL injection payload в качестве значения неиспользуемого параметра со случайным именем (например, ifZxy). Если в результате отправки такого запроса веб-сервер возвращает содержимое, заметно отличающееся от оригинала, sqlmap может решить, что какой-то механизм защищает целевое веб-приложение.
Для идентификации WAF используются несколько различных «полезных нагрузок», характерных для различных атак на веб-приложения, приходящие ответы анализируются в скриптах, отвечающих за идентификацию различных веб-файрволов (директория waf внутри sqlmap). В случае успеха скрипт вернет sqlmap логическое значение true, чтобы сообщить, что целевой WAF успешно обнаружен.

sqlmap_waf

 ОБНАРУЖЕНИЕ ЛОЖНЫХ СРАБАТЫВАНИЙ

Ложное срабатывание (или ложная тревога) — это термин, используемый для описания результата, который показывает, что данное условие присутствует, когда на самом деле это не так. Это реальная проблема, потому что у пользователя возникает ложное чувство уверенности, когда на самом деле в веб-приложении абсолютно нечего эксплуатировать.
Это особенно заметно в boolean-based и time-based слепых методах.

Смотрите так же   Скрипт автоматической установки Linux, Nginx, MySQL, PHP и WordPress

В случае boolean-based, если целевое веб-приложение содержит динамические части (например, рекламу), или в случае time-based, если время ответа веб-сервера включает в себя значительные сетевые задержки, инструменты для автоматического обнаружения SQL-инъекций могут запросто сделать неправильный вывод.

Чтобы избежать такого рода ошибок, после фазы обнаружения sqlmap проводит простые тесты. В случае если целевое веб-приложение не в состоянии ответить ожидаемым образом на предопределенную логическую операцию (например, id=l AND 9Б>27), sqlmap может сделать заключение, что он имеет дело с false positive.

Sqlmap проводит такого рода тесты только в тех случаях, когда никакие другие методы, кроме слепых boolean-based и time-based техник, уже не доступны для использования, так как ложные срабатывания обычно возникают из-за недетерминированной природы дифференциации ответов веб-страницы. Это означает, например, что если целевое веб-приложение возвращает ожидаемую строку в случае метода, основанного на ошибках (error-based), то нет никакой необходимости в такого рода тестировании.

Нередки также случаи, когда значения входных параметров предварительно обрабатываются, чтобы отфильтровать и/или закодировать специальные символы (например, при помощи РНР-функции htmlspecialchars()). Так как sqlmap активно использует знак «больше» (>) для операции сравнения в слепом boolean-based и time-based методе, это будет препятствовать его нормальной работе. Соответственно, пользователю выдается предупреждение, что ему следует перезапустить программу, выбрав подходящий сценарий для обфускации payload’a (например, —tamper=between), чтобы решить данную проблему.

 ОБНАРУЖЕНИЕ ЗАДЕРЖКИ

В технике слепого метода, основанной на изменении времени (time-based), атакующий пытается сделать преднамеренную задержку в ответе сервера на основе условного выражения, содержащего в себе вопрос, который является «истиной». Измеряя время отклика целевой системы, он может сделать вывод. Если цель отвечает с заметной задержкой, атакующий может сделать вывод, что ответ — true, в то время как в случае, если цель отвечает обычным образом, он может сделать вывод, что ответ — false.

Задержка в сети, из-за своей недетерминированности, является главным врагом временной техники. Если, скажем, сервер отвечает за одну секунду, а диапазон нормального времени для отклика составляет от 0,5 до 1,5 с, то очень трудно сделать вывод, является ли ответ true или false. Другой случай — когда не установлено конкретное значение параметра промежутка времени, как в payload’ax на базе тяжелых запросов. В этих случаях нет простого способа определить, имела место задержка или нет.
Sqlmap использует математическую статистику, чтобы отличить true от false ответов. В начале запуска программа изучает, что «нормально», а что нет. Время ответа обычных запросов и несущих боевую нагрузку, не использующую механизм задержки (например, boolean-based слепой метод), записываются как нормальные и собираются для дальнейшей обработки. В случае если есть необходимость собрать их побольше, делается еще пара фиктивных запросов.
Когда нужно сделать заключение, была задержка или нет, рассчитывается колоколообразная кривая (Гаусса) нормального распределения. Все, что нормально (то есть не намеренно затянуто), должно располагаться под кривой с высокой вероятностью. Точнее, если задержка имеет значение меньше, чем значение верхней границы ц(Т) + 7о(Т), где ц — среднее значение, а о представляет собой стандартное отклонение времени отклика, вероятность того, что мы наблюдаем нормальный ответ, 99,99%.

Смотрите так же   Сканируем интернет со Spidy

Чем уже колоколообразная кривая, тем лучше. В случае значительной задержки в сети более высокие значения задержки (если применимы) будут необходимы, чтобы использоваться для выполнения уравнения, так как мы хотим выйти за пределы «нормальности». Если мы сможем это сделать, то будем способны различать с высокой точностью, где есть задержка, а где ее нет.
Sqlmap автоматически вычисляет параметры гауссовой колоколообразной кривой и сравнивает со временем ответов.
Если есть признаки значительной задержки сети, программа предупреждает пользователя, чтобы он использовал настолько высокое значение задержки (если это применимо), насколько это возможно. Кроме того, с другой стороны, в случае если используемое значение задержки существенно выше, чем указанное верхнее значение границы, sqlmap автоматически оптимизирует значение задержки до более подходящей, что сократит время перебора.

 ПОИСК КОЛИЧЕСТВА ПОЛЕЙ В ЗАПРОСЕ

Чтобы успешно использовать UNION-технику, нужно знать число полей, участвующих в уязвимом запросе. Основной метод — это использование условия ORDER BY В случае если ответ для произвольно большого значения (например, ORDER BY 9143) резко отличается от нормального ответа, sqlmap постарается выяснить количество полей запроса с помощью адаптивного алгоритма бинарного поиска.
В нем пространство поиска разделено на большие отрезки (например, размером 10), последовательным образом определяется нужный отрезок, внутри которого задействуется классический алгоритм бинарного поиска. Поиск осуществляется до тех пор, пока не находится такое значение N+1, которое имеет совершенно другой ответ по сравнению со значением для N. В этом случае sqlmap может с высокой вероятностью сделать вывод, что количество полей в уязвимом запросе равно N.

Если метод ORDER BY неприменим, sqlmap будет использовать подход, как при обнаружении задержки. Постоянное значение поля (например, NULL) будет использоваться в текущем отрезке поискового пространства в UNION ALL SELECT выражении, а ответы будут записываться.
Если ответ на определенное количество полей, по сравнению с оригинальным ответом, выделяется из остальных статистическим образом, sqlmap может с высокой вероятностью сделать вывод, что нашел нужное количество полей, участвующих в уязвимом запросе.
Так как результаты ответов с неверным количеством полей не будут значительно отличаться друг от друга, ответ с правильным количеством обязательно проявится в сравнении с ними (то есть он не будет подходить под колоколообразную кривую Гаусса). Если такого значения нет в текущем отрезке поиска (например, 1 -10), sqlmap перейдет к другому, в зависимости от используемого уровня тестирования (опция —level).

 ЗАКЛЮЧЕНИЕ

Видишь, сколько разнообразных техник было собрано в одной тулзе, чтобы максимально упростить нам жизнь. Недаром sqlmap — очень популярный среди пентестеров всего земного шара инструмент для проверки веб-приложений на наличие уязвимостей SQL injection. Надеюсь, теперь, когда ты представляешь, как все устроено изнутри, ты сможешь использовать возможности программы на все 100%.

Может быть интересно:

2 комментария

Добавьте комментарий