Blind SQL Injection - Методы Автоматизации
Life-Hack [Жизнь-Взлом]/ХакингВ этой статье мы поговорим о Blind SQL Injections и способах автоматизации их эксплуатации.
Что такое SQL-инъекция?
- Данные, предоставленные клиентом, передаются в приложение без соответствующей проверки (фильтрации)
- Обработка этих данных как команд для базы данных
Часто используется для:
- Выполнения операций с базой данных
- Обхода механизмов аутентификации
- Получения недоступной иным образом информации из базы данных
- Запись в базу данных такой информации, как новые учетные записи пользователей
Три формы SQL-инъекции:
Существует три основных формы SQL-инъекций, используемых для чтения информации из базы данных.
- Перенаправление и изменение формы запроса
- На основе сообщения об ошибках
- Слепая инъекция
Blind SQL Injection
- Методы слепой инъекции SQL могут включать формирование запросов, приводящих к логическим значениям, и интерпретации исходящих HTML-страниц
- SQL-инъекция может привести к серьезной утечке данных и / или атакам модификации данных
- Слепые атаки, по сути, представляют игру с 20-ю запросами к веб-серверу
Зачем сосредотачиваться на слепых инъекциях?
- Слепые инъекции так же распространены, как и любые другие инъекции
- Такие дыры в системах связаны с ложным чувством безопасности на хостах
- Требуется больше времени для выполнения ручного проникновения
Преимущества автоматизированного тестирования:
- Мы можем задать серверу столько вопросов типа «да / нет», сколько захотим
- Для поиска первой буквы имени пользователя с помощью двоичного поиска требуется 7 запросов
- Чтобы найти полное имя пользователя, если оно состоит из 8 символов, требуется 56 запросов
- Для поиска имени пользователя из 8 символов требуется 6 запросов
- 62 запроса только на поиск имени пользователя
- Запросы суммируются
- Предположим, что каждый запрос занимает 10 секунд
- Предполагая, что пентестер не ошибается
- Имя пользователя из 8 символов занимает более десяти минут
- Что, если нам нужна схема или вся база данных?
Если вы хотите нетривиального проникновения:
- Имена таблиц
- Имена столбцов
- Актуальные данные
Это может занять часы, дни или больше, в зависимости от размера базы данных.
Звучит просто?
Эффективный инструмент сложнее, чем «Несколько сценариев оболочки и netcat» Пример запроса, переданного через уязвимый к SQL инъекции параметр:



Поиск целых чисел:
- Выберите диапазон (обычно начиная с 0)
- Увеличивайте значение экспоненциально в два раза, пока не будет обнаружен верхний предел
- Разделение на полпути между верхним пределом и предыдущим значением
- Продолжайте делить секции пополам, пока не останется одно значение
Проблема:
Как мы распознаем истинные и ложные страницы с веб-сервера?
- Мы воспринимаем распознавание паттернов как должное
- А нельзя просто сравнить строки?
НЕТ!
- Вся суть веб-приложения в том, чтобы иметь динамический контент.
- Вполне вероятно, что раздел с указанием истинности / ложности не является единственным динамическим содержанием.
- Сравнение строк подходит для инъекции на основе ошибок, но не для слепой инъекции

Решение первое: поиск по ключевым словам:
- Требует прямого вмешательства пользователя
- Взаимодействие с пользователем требует усилий, которые мы стараемся минимизировать.
Решение второе: сумма MD5
- Веб-приложения разработаны, чтобы быть динамическими
- MD5 вызывает большие изменения на выходе из небольшого изменения входящих данных
Google vs. Hoogle

Сравнение суммы MD5
- MD5 плохо обрабатывает изменения
- Может работать с некоторыми веб-приложениями, но не полностью
Решение третье: механизм распознавания текста
- Инструменты различения текста предназначены для выделения информационных изменений, которые нас не интересуют.
- Много усилий тратится на сохранение информации, которая будет просто отброшена.
Решение четвертое: разобрать дерево HTML
- Представлять текст как HTML-объекты в древовидной структуре данных.
- Ищите различия в форме деревьев.
- Если изменяются только данные без разметки, не будет возможности продолжить автоматизацию.
- Проще реализовать парсер xhtml, чем реалистичный парсер html.
Решение пятое: линейное представление сумм ASCII
small input variation = small output

Сравнение подписей
Создание базовых сценариев
- Потребуются базовые случаи для сравнения неизвестных
- Мы уже знаем гарантированные истинные / ложные страницы
- У нас есть несколько вариантов для известных базовых случаев
Самый простой - 1 = 1 против 1 = 0.
Образец набора подписей

Реалистичный набор подписи

Сравнение диапазона допусков
- Незначительные изменения в текстовом содержании приводят к небольшим общим изменениям в сумме
- Изменения все еще происходят
- Допускание значений вместо точного сравнения в суммах снижает количество ложноотрицательных результатов
| Σknown – Σunknown | / Σknown
Сравнение диапазона допусков

Недостатки сравнения диапазона допусков:
- Работает, но очень много ненужных сравнений
- Не использует известные мусорные данные
Субтрактивный фильтр
- Мы можем определить равные суммы между конфликтующими базовыми случаями.

Субтрактивный фильтр
- Это можно комбинировать с диапазоном допуска, чтобы исключить ненужные сравнения

Адаптивный фильтр
- Позволяет профилировать приложение перед тестированием на неизвестные
- Удаляет ненужные данные, которые могут исказить результаты
- Требуется несколько базовых случаев
Два «идентичных» образца

Применен адаптивный фильтр

Преимущества адаптивного фильтра
- На данном этапе толерантность практически не нужна
- Удаляет наиболее динамический контент, не связанный с утечкой данных
SQueaL
- SQueaL был создан параллельно с представляемым исследованием
- Написан на C # для Windows и Linux.
- Доступны графические интерфейсы Windows.Forms и Gtk-Sharp.
- Бесплатно для некоммерческого использования
- Экспорт данных в формат XML для удобного представления клиентам / PHB.
SQueaL: экспорт данных
- SQueaL использует собственный формат XML для сохранения данных эксплойтов.
<SQueaLdata version="0.01a"> <target address="vulnerable.org:8080/test.php" method="GET" ssl="False"> <parameter name="prod_id" value="2" injectable="True" /> </target> <attackvector name="prod_id" buffer="2" type="BlindTSQLInjection"> <truepage> <signature-item>3029</signature-item> <signature-item>3897</signature-item> <signature-item>572</signature-item> ...
Сбор информации о таблицах:
Начнем с идентификации номера каждой таблицы:
... AND (SELECT COUNT(name) FROM sysobjects WHERE xtype=char(85)) > search_value ... AND (SELECT MIN(id) FROM sysobjects WHERE id > prev_table_id AND xtype=char(85)) > search_value
Дополнительная информация о таблице:
Теперь мы можем получить имя каждой таблицы:
... AND (SELECT TOP 1 LEN(name) FROM sysobjects WHERE id= table_id AND xtype=char(85)) > search_value ... AND (SELECT ASCII(SUBSTRING(name, character_counter ,1)) FROM sysobjects WHERE id=table_id) > search_value
Сбор информации о полях:
Получив информацию о таблице, мы можем перейти к полям.
... AND (SELECT COUNT(name) FROM syscolumns WHERE id=table_id) > search_value ... AND (SELECT MIN(colid) FROM syscolumns WHERE colid > prev_colid AND id=table_id) > search_value ... AND (SELECT TOP 1 LEN(name) FROM sysobjects WHERE id=table_id AND colid=colid) > search_value ... AND (SELECT ASCII(SUBSTRING(name, character_counter, 1)) FROM syscolumns WHERE id=table_id AND colid=colid) > search_value ... AND (SELECT TOP 1 (xtype) FROM syscolumns WHERE id=table_id AND colid=colid) > search_value
Типы данных полей
Сбор типов данных поля выполняется быстрее, но требует знания сопоставления типов:

SQueaL: время работы
- Пример веб-приложения привел к более 2700 HTTP-запросам
- Если мы воспользуемся оценкой «10 секунд» ранее, это заняло бы более 7,5 часов без перерыва
- Реальная производственная база данных будет еще больше и длиннее
Недостатки / способы устранения
- User-Agent
- Генерация шума / DoS в журнале сервера
- Суммы HTML могут быть отравлены случайными числами
- Не «lower the bar» для поиска эксплойтов.
- Проблемы с отсутствием возврата каретки / автоматически созданного HTML
Принудительный CRLF
Что происходит, когда HTML создается без возврата каретки?
- Естественная тенденция к принудительному возврату каретки
- Это скинет данные
На этом этапе потребуется анализатор HTML.
Вывод
- Те же методы можно использовать с запросами, указывающими на недопустимый SQL.
- Относитесь к ним как к вопросам, типа «Правильный ли этот синтаксис?» что в настоящее время yes / no?
- MD5 не сильно хорош для этих целей
Те же методы можно использовать в других приложениях для интерпретации результатов ответов HTML.
- Внедрение XPath
- Инъекция LDAP
Используйте параметризованный код соответствующим образом для вызова хранимых процедур.