Содержание статьи
Сначала разберемся с общей методологией поиска многоэтапных SQLi, затем посмотрим, какие встроенные функции sqlmap помогут нам в выявлении, а под конец напишем собственную обертку для поиска таких инъекций.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Как искать многоэтапные SQLi
В тестировании многоэтапных инъекций я выделяю четыре основных этапа.
- Подготовка. На этапе подготовки создаются данные или объекты, в которые или при помощи которых будет выполняться инъекция. Пример: создание черновика новости на новостном портале (кнопка «Создать черновик») или создание нового письма (кнопка «Написать письмо»).
- Внедрение. Этап, на котором происходит непосредственное добавление нагрузки в передаваемые данные. Пример: сохранение новости после редактирования.
- Подтверждение. На этом этапе подтверждается создание объекта. Пример: подтверждение публикации новости.
- Результат. Здесь подразумевается, что есть отдельная страница, на которой можно увидеть результат срабатывания инъекции. Пример: страница опубликованной новости.
Каждый этап может представлять собой несколько запросов, однако их суть при этом сохраняется:
- Запросы перед инъекцией.
- Запрос с инъекцией.
- Запросы после инъекции.
- Проверка срабатывания.
В бизнес‑логике приложения могут присутствовать не все этапы. Например, нет этапа подготовки: для создания новости может быть не нужно отправлять отдельный запрос, новость создается сразу во время редактирования.
Встроенные функции в sqlmap для эксплуатации многоэтапных SQLi
Встроенные функции sqlmap позволяют взаимодействовать не только с запросом, в который внедряется нагрузка, но и с запросами, идущими после него и перед ним.
Основные функции:
- обработка нагрузки (tamper);
- изменение основного запроса (eval);
- выполнение одного запроса после основного (second-req/second-url).
Sqlmap tamper
Назначение: модификация нагрузки перед отправкой при помощи кода на Python.
Параметр:
--tamper /path/to/tamper
Особенности:
- Есть готовые темперы. Обычно они расположены в
/
.usr/ share/ sqlmap/ tamper/ - Посмотреть существующие темперы можно командой
sqlmap
.--list-tampers - Можно создавать собственные темперы на Python.
Для чего может быть полезен:
- обход WAF, примеры на GitHub;
- выполнение запросов перед отправкой основной нагрузки sqlmap.
Как создать кастомный tamper
Создаем файл с расширением .py. Например, test.
. Вставляем в него заготовку:
#!/usr/bin/env python3from lib.core.enums import PRIORITY__priority__ = PRIORITY.NORMALdef dependencies(): passdef tamper(payload, **kwargs): """ This accepts the payload that SQLMap will send to the target, then returns the formatted payload """ if payload: # Do stuff to the payload here. Probably best to # set a new variable and return that once you # manipulate it however. pass return payload
Коротко о том, что есть в этой структуре:
-
__priority__
— переменная, которая позволяет определить порядок tamper sqlmap, если их несколько. Всего существует семь регламентированных значений:-
PRIORITY.
;LOWEST -
PRIORITY.
;LOWER -
PRIORITY.
;LOW -
PRIORITY.
;NORMAL -
PRIORITY.
;HIGH -
PRIORITY.
;HIGHER -
PRIORITY.
.HIGHEST
-
-
dependencies(
— потенциально эта функция предназначена для дополнительных зависимостей, но в данный момент используется в темперах только для вывода информации в sqlmap:) def dependencies():singleTimeWarnMessage("This is a warning from your tamper script!") -
tamper(
— функция, обрабатывающая полезную нагрузку, которая передается в параметреpayload, **kwargs) payload
. Также можно получить доступ к другим параметрам запроса через**kwargs
. И даже изменить их:def tamper(payload, **kwargs):headers = kwargs.get("headers", {})headers["X-FORWARDED-FOR"] = "127.0.0.1"return payload
Последним шагом необходимо создать в директории пустой файл __init__.
.
Теперь мы можем указывать этот файл в параметре, как показывалось до этого:
--tamper /path/to/test.py
Также может быть полезно изучить эти материалы:
- HackTricks: Second Order Injection — SQLMap
- Статья по темперу sqlmap: Writing your own SQLMap Tamper Scripts
- Китайская мудрость на тему автоматизации sqlmap: Semi-automatic-mode-sqlmap
Sqlmap eval
Назначение: модификация запроса перед отправкой при помощи кода на Python.
Параметр:
--eval="#first line; #second line; #third line"
Особенности:
- Не имеет доступа к нагрузке, которая будет передана. При замене переменной нагрузка утрачивается.
- Модифицирует запрос каждый раз, когда отправляется основная нагрузка;
--second-req
не модифицируется. - Модифицировать можно любую часть запроса, в том числе и URI.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»