
Инструмент для эксплуатации SQL-инъекций
#BBQSQL# Инструмент для эксплуатации слепой SQL-инъекции
Слепая SQL-инъекция может быть настоящей болью при эксплуатации. Когда доступные инструменты работают, они работают хорошо, но когда они не работают, приходится писать что-то своё. Это отнимает много времени и утомительно. BBQSQL может помочь вам решить эти проблемы.
BBQSQL — это фреймворк для слепой SQL-инъекции, написанный на Python. Он чрезвычайно полезен при атаке на сложные уязвимости SQL-инъекции. BBQSQL также является полуавтоматическим инструментом, допускающим значительную настройку для тех сложных случаев SQL-инъекции. Инструмент спроектирован как независимый от СУБД и очень универсален. Он также имеет интуитивно понятный пользовательский интерфейс, значительно упрощающий настройку атак. Кроме того, реализована библиотека Python gevent, что делает BBQSQL чрезвычайно быстрым.
Мы постарались написать инструмент так, чтобы настройка атаки в интерфейсе была очень понятной. Однако для полноты мы включили подробный Readme, который должен дать вам дополнительное понимание особенностей каждой опции конфигурации. Стоит отметить, что каждая опция конфигурации в интерфейсе имеет своё описание, так что если вы решите запустить инструмент без прочтения этой страницы, вы всё равно сможете пробиться через атаку.
Как и другие инструменты SQL-инъекции, вы предоставляете определённую информацию о запросе.
Необходимо предоставить обычную информацию:
Затем укажите, куда будет вставляться инъекция и какой синтаксис мы инжектируем. Читайте далее для подробностей.
Это должно быть просто, но что есть. Попробуйте выполнить:
sudo pip install bbqsql
Если это не сработает, вы можете установить из исходников. Инструмент требует gevent и requests.
В меню вы увидите место для параметров BBQSQL. Здесь вы указываете следующие опции:
Это описано более подробно ниже в обзоре синтаксиса запросов.
Имя файла для вывода результатов. Оставьте это поле пустым, если не хотите выводить в файл.
BBQSQL использует два метода при проведении атаки слепой SQL-инъекции. Первый и используемый по умолчанию метод — binary_search. См. Википедию для получения дополнительной информации.
Второй метод, который вы можете использовать — frequency_search. Поиск по частоте основан на анализе английского языка для определения частоты, с которой встречается буква. Этот метод поиска очень быстр для неэнтропийных данных, но может быть медленным для неанглийских или запутанных данных.
Вы можете указать либо binary_search, либо frequency_search в качестве значения для этого параметра.
Этот параметр определяет тип SQL-инъекции, которую вы обнаружили. Здесь вы можете установить, какой атрибут HTTP-ответа BBQSQL должен анализировать для определения true/false.
Вы можете указать: status_code, url, time, size, text, content, encoding, cookies, headers или history
Если вы обнаружили SQL-инъекцию, которая приводит к разному коду статуса сервера, установите здесь 'status_code'. Если отличается cookie — установите 'cookie'. Если отличается размер ответа — установите 'size'. Вы поняли суть.
Concurrency основан на библиотеке gevent в Python. Функционально это выглядит как многопоточность, но подробности работы можно увидеть в нашем докладе на DefCon [ссылка вставлена]. Эта настройка управляет степенью параллелизма при выполнении атаки. Это полезно для регулирования запросов и ускорения времени атаки. Для действительно производительных веб-серверов, таких как nginx, мы смогли установить concurrency на 75. По умолчанию установлено значение '30'.
Если вы столкнулись с уязвимостью SQL-инъекции, имеющей некоторые странные особенности (например, нельзя включать определённые символы или такие функции, как ASCII/CHAR, не работают), вы, вероятно, оказывались в ситуации, когда писали какой-то скрипт с собственным синтаксисом инъекции. BBQSQL устраняет необходимость написания скриптов и предоставляет способ вставить ваш собственный синтаксис запроса и легко эксплуатировать уязвимость.
Поле ввода запроса — это место, где вы будете строить запрос для извлечения информации из базы данных. Предполагается, что вы уже обнаружили SQL-инъекцию на уязвимом параметре и протестировали запрос, который работает.
Ниже приведён пример запроса, который вы можете использовать для построения своего запроса.
В этом примере атакующий хочет выбрать версию базы данных:
vulnerable_parameter'; if(ASCII(SUBSTRING((SELECT @@version LIMIT 1 OFFSET ${row_index}) , ${char_index} ,1))) ${comparator:>}ASCII(${char_val}) WAITFOR DELAY '0\:0\:0${sleep}'; --
Синтаксис запроса основан на заполнителях, которые сообщают BBQSQL, как выполнять атаку.
Вам необходимо указать следующие заполнители, чтобы атака сработала. Как только вы поместите их в свой запрос, BBQSQL сделает всё остальное:
${row_index}: Указывает BBQSQL перебирать строки здесь. Поскольку мы используем LIMIT, мы можем просмотреть n-ное количество строк в зависимости от значения ${row_index}.
${char_index}: Указывает BBQSQL, какой символ из подзапроса нужно запрашивать.
${char_val}: Указывает BBQSQL, с чем сравнивать результаты из подзапроса для проверки результата.
${comparator}: Это способ указать BBQSQL, как сравнивать ответы, чтобы определить, истинен результат или нет. По умолчанию используется символ >.
${sleep}: Это необязательный параметр, указывает BBQSQL, куда вставлять количество секунд задержки при выполнении временной SQL-инъекции.
Не все эти заполнители обязательны. Например, если вы обнаружили полу-слепую логическую SQL-инъекцию, вы можете опустить параметр ${sleep}.
BBQSQL имеет множество HTTP-параметров, которые вы можете настроить при подготовке атаки. Как минимум, вы должны указать URL, куда должен быть вставлен запрос инъекции, и метод. Можно задать следующие опции:
Вы указываете, куда нужно вставить запрос инъекции, используя шаблон ${injection}. Без шаблона инъекции инструмент не будет знать, куда вставлять запрос.
Укажите файлы, которые будут отправлены с запросом. Установите значение пути, и BBQSQL позаботится об открытии/включении файла.
HTTP-заголовки, которые будут отправлены с запросами. Это может быть строка или словарь. Например:
{"User-Agent":"bbqsql"}
или
"User-Agent: bbqsql"
Словарь или строка куки, которые будут отправлены с запросом. Например:
{"PHPSESSIONID":"123123"}
или
PHPSESSIONID=123123;JSESSIONID=foobar
Укажите URL, на который должны отправляться запросы.
Это логическое значение, определяющее, будут ли следовать HTTP-перенаправлениям при выполнении запросов.
Укажите HTTP-прокси для запроса в виде словаря. Например:
{"http": "10.10.1.10:3128","https": "10.10.1.10:1080"}
Укажите данные POST, которые будут отправлены вместе с запросом. Это может быть строка или словарь. Например:
{"input_field":"value"}
или
input_field=value
Укажите метод для HTTP-запроса. Допустимые методы:
'get','options','head','post','put','patch','delete'
Укажите кортеж из имени пользователя и пароля для HTTP-базовой аутентификации. Например:
("myusername","mypassword")
После того как вы настроили атаку в интерфейсе, вы можете экспортировать файл конфигурации. Вы увидите эту опцию при запуске инструмента. Экспортированный файл конфигурации использует ConfigParser и легко читается. Пример файла конфигурации приведён ниже:
`[Request Config] url = http://example.com/sqlivuln/index.php?username=user1&password=secret${injection} method = GET
[HTTP Config] query = ' and ASCII(SUBSTR((SELECT data FROM data LIMIT 1 OFFSET ${row_index:1}),${char_index:1},1))${comparator:>}${char_val:0} # technique = binary_search comparison_attr = size concurrency = 30`
Это полезно, если вы планируете возобновить атаку или просто скорректировать запрос, не желая проходить через возню с перенастройкой всех опций.
Вы также можете импортировать конфигурацию из командной строки или из пользовательского интерфейса. Чтобы импортировать конфигурацию из командной строки, просто запустите bbqsql со следующими опциями:
bbqsql -c config_file
Когда вы загружаете файл конфигурации через командную строку или пользовательский интерфейс, выполняются те же процедуры проверки параметров на их корректность.
Иногда нужно сделать что-то действительно сумасшедшее. Может быть, вам нужно зашифровать значения, поступающие в поле, перед отправкой запроса, или, возможно, вам нужно трижды закодировать URL. В любом случае, такие ситуации делают другие инструменты непригодными. BBQSQL позволяет вам определять функции "хуков", которые инструмент будет вызывать в различных точках запроса. Например, вы можете указать функцию pre_request, которая принимает запрос в качестве аргумента, выполняет необходимые мутации и возвращает модифицированный запрос для отправки на сервер.
Для реализации этого создайте файл Python и укажите функции-хуки. Доступные имена функций перечислены ниже. В вашем файле хуков вы можете определить столько или так мало функций, сколько захотите. Затем в разделе bbqsql_options меню вы можете указать расположение вашего hooks_file. BBQSQL загрузит этот файл и будет использовать определённые вами хуки.
Важно, чтобы функции-хуки, которые вы указываете, имели именно те имена, что указаны ниже, иначе BBQSQL не будет знать, какой хук вызывать в нужный момент. Функция args получает один параметр, содержащий все аргументы, используемые для создания HTTP-запроса. Функция pre_request получает объект запроса перед отправкой. Функция post_request получает объект запроса после отправки. Функция response получает объект ответа до его возврата в BBQSQL.
Доступны следующие хуки:
args: Словарь аргументов, отправляемых в Request().
pre_request: Объект Request непосредственно перед отправкой.
post_request: Объект Request непосредственно после отправки.
response: Ответ, сгенерированный из Request.
Для получения дополнительной информации о том, как работают эти хуки и как должен выглядеть ваш словарь hooks, обратитесь к документации библиотеки requests о хуках
Пример файла хуков может выглядеть так:
# file: hooks.py
import time
def pre_request(req):
"""
этот хук заменяет заполнитель на текущее время
ожидается, что URL будет выглядеть так:
http://www.google.com?k=v&time=PLACEHOLDER
"""
req.url = req.url.replace('PLACEHOLDER',str(time.time()))
return req
Отправляйте любые исправления ошибок или запросы функций на https://github.com/Neohapsis/bbqsql/
Пожалуйста! Мы видим в этом отличную отправную точку для создания полнофункционального фреймворка SQL-инъекции. Не стесняйтесь форкать код, и мы сможем слить ваши изменения, если они будут полезны.
BBQ — это абсолютно вкусно, как и SQL-инъекция!