Содержание статьи
Тамперы воспринимаются как простые скрипты для обфускации кода. Настало время полностью перевернуть представление о тамперах. Давай углубимся в исходники sqlmap, чтобы понять, где ты можешь выйти за рамки, очерченные разработчиками мапы.
Что такое тамперы
При всей мощи sqlmap не имеет собственного механизма обфускации полезной нагрузки. Инъекции отправляются «как есть». Если атакующее приложение защищено даже самым простым фильтром, sqlmap становится бесполезным. Чтобы решить проблему, разработчики sqlmap добавили возможность создавать собственные обфускации. Это обычные скрипты, написанные на Python (поскольку на нем написан сам sqlmap). Называются такие скрипты тамперами.
Тамперы обязаны принимать пейлоад в виде строки и возвращать новый пейлоад строкой. Мапа применяет тамперы прямо перед отправкой. Чтобы разобраться, посмотри на пример работы предустановленного тампера space2comment
.
Добавить скрипт к атаке sqlmap можно через директиву --tamper
:
sqlmap -r file_name.txt –tamber=space2comment
Например, sqlmap собрался послать пейлоад SELECT
. Результатом работы space2comment
будет замена пробелов символами /
:
SELECT/**/password/**/FROM/**/admins;
Тамперы должны соответствовать определенной структуре. Вот базовая структура любого тампера:
from lib.core.enums import PRIORITY__priority__ = PRIORITY.NORMALdef dependencies(): passdef tamper(payload, **kwargs): return payload
Это полностью рабочий скрипт. Можно спокойно положить файл скрипта в /
и запустить с мапой. Правда, он ничего не делает, просто возвращает пейлоад в первозданном виде.
Обязательный элемент тампера один — функция tamper(
. Остальное можно опустить, если это не помешает скрипту выполнять свою работу.
Приоритеты тамперов
Порядок, в котором ты вводишь список тамперов, важен. Большая разница — применить сначала url-encoding
, а потом space2plus
и наоборот. Функция url-encoding
кодирует пробелы в %20
, соответственно, тампер space2plus
не найдет пробелов и не внесет изменений, WAF будет проще обнаружить инъекцию. Если использовать обратный порядок, то space2plus
заменит пробелы символами +
, а url-encoding
превратит их в %2B
, и WAF будет считать всю строку одним словом: SELECT%20FROM%20USERS
, а не SELECT%2BFROM%2BUSERS
.
Мапа контролирует приоритеты при помощи переменной __priority__
и набора констант PRIORITY
из пакета lib.
. Если не укажешь приоритет в скрипте, мапа автоматом назначит приоритет NORMAL
.


Большинство предустановленных скриптов работает с приоритетом NORMAL
, так как редко возникает необходимость выполнять тампер раньше любого другого. Скрипты с приоритетом NORMAL
могут идти в любом порядке, только не забывай про логику преобразований. Но если попытаешься пустить кого‑то перед «привилегированными», sqlmap будет ругаться и предложит навести порядок.

Зависимости
Функция dependencies(
запускается один раз перед стартом тампера. Изначально функция нужна для проверки того, установлены ли нужные пакеты. Но разработчики тамперов используют ее для вывода сообщения пользователю. Функция dependencies(
гарантирует, что сообщение будет показано, даже если сам тампер не запустится.
На скрине выше space2mssqlblank
пишет, что тампер space2mssqlblank
годится только для Microsoft SQL Server.
def dependencies(): singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s" % (os.path.basename(__file__).split(".")[0], DBMS.MSSQL))
Вариант проверки пакета используется реже, в очень специфических тамперах, в которых обязательна установка дополнительной библиотеки. Импорт внутри функции dependencies(
помогает избежать краха мапы. Код функции оборачивается в try
/exception
, что приводит к нежной остановке, если библиотека не установлена.
Функция tamper()
Перед каждый запросом к таргету sqlmap обходит коллекцию указанных пользователем тамперов и вызывает все функции tamper(
. Функция обязана получить и вернуть пейлоад независимо от того, выполняла она какие‑то преобразования или нет.

На скриншоте видно, что при вызове function
(строка 1088), кроме payload
, передаются три параметра: заголовки, разделитель и hints
. Значение есть только в delimiter
. Это разделитель между параметрами, например &
.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее