Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
SQL-инъекции — одна из самых приятных уязвимостей при пентесте. Но встречаются они все реже, поскольку современные инструменты безопасности без труда их отлавливают. Сложнее бывает выявить инъекцию, которая срабатывает при передаче данных между сервисами. Сегодня мы поговорим о детекте именно таких SQLi — тех, что срабатывают не сразу, а где‑то в глубине бизнес‑логики.
Сначала разберемся с общей методологией поиска многоэтапных SQLi, затем посмотрим, какие встроенные функции sqlmap помогут нам в выявлении, а под конец напишем собственную обертку для поиска таких инъекций.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
В тестировании многоэтапных инъекций я выделяю четыре основных этапа.
Каждый этап может представлять собой несколько запросов, однако их суть при этом сохраняется:
В бизнес‑логике приложения могут присутствовать не все этапы. Например, нет этапа подготовки: для создания новости может быть не нужно отправлять отдельный запрос, новость создается сразу во время редактирования.
Встроенные функции sqlmap позволяют взаимодействовать не только с запросом, в который внедряется нагрузка, но и с запросами, идущими после него и перед ним.
Основные функции:
Назначение: модификация нагрузки перед отправкой при помощи кода на Python.
Параметр:
--tamper /path/to/tamper
Особенности:
/usr/share/sqlmap/tamper/
. sqlmap --list-tampers
. Для чего может быть полезен:
Как создать кастомный tamper
Создаем файл с расширением .py. Например, test.py
. Вставляем в него заготовку:
#!/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__.py
.
Теперь мы можем указывать этот файл в параметре, как показывалось до этого:
--tamper /path/to/test.py
Также может быть полезно изучить эти материалы:
Назначение: модификация запроса перед отправкой при помощи кода на Python.
Параметр:
--eval="#first line; #second line; #third line"
Особенности:
--second-req
не модифицируется. Источник: xakep.ru