Там­перы в sqlmap обыч­но исполь­зуют, что­бы обма­нуть филь­тры. Но зачем оста­нав­ливать­ся на этом? В этой статье я покажу, как мож­но дос­тичь гораз­до боль­шего: под­нимать сес­сию пос­ле обры­ва, ата­ковать second-order SQLi и даже сту­чать­ся тебе в Telegram при наход­ке уяз­вимос­ти.

Там­перы вос­при­нима­ются как прос­тые скрип­ты для обфуска­ции кода. Нас­тало вре­мя пол­ностью перевер­нуть пред­став­ление о там­перах. Давай углу­бим­ся в исходни­ки sqlmap, что­бы понять, где ты можешь вый­ти за рам­ки, очер­ченные раз­работ­чиками мапы.

 

Что такое тамперы

При всей мощи sqlmap не име­ет собс­твен­ного механиз­ма обфуска­ции полез­ной наг­рузки. Инъ­екции отправ­ляют­ся «как есть». Если ата­кующее при­ложе­ние защище­но даже самым прос­тым филь­тром, sqlmap ста­новит­ся бес­полез­ным. Что­бы решить проб­лему, раз­работ­чики sqlmap добави­ли воз­можность соз­давать собс­твен­ные обфуска­ции. Это обыч­ные скрип­ты, написан­ные на Python (пос­коль­ку на нем написан сам sqlmap). Называ­ются такие скрип­ты там­перами.

Там­перы обя­заны при­нимать пей­лоад в виде стро­ки и воз­вра­щать новый пей­лоад стро­кой. Мапа при­меня­ет там­перы пря­мо перед отправ­кой. Что­бы разоб­рать­ся, пос­мотри на при­мер работы пре­дус­танов­ленно­го там­пера space2comment.

До­бавить скрипт к ата­ке sqlmap мож­но через дирек­тиву --tamper:

sqlmap -r file_name.txt –tamber=space2comment

Нап­ример, sqlmap соб­рался пос­лать пей­лоад SELECT password FROM admins;. Резуль­татом работы space2comment будет замена про­белов сим­волами /**/:

SELECT/**/password/**/FROM/**/admins;

Там­перы дол­жны соот­ветс­тво­вать опре­делен­ной струк­туре. Вот базовая струк­тура любого там­пера:

from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
return payload

Это пол­ностью рабочий скрипт. Мож­но спо­кой­но положить файл скрип­та в /usr/share/sqlmap/tamper и запус­тить с мапой. Прав­да, он ничего не дела­ет, прос­то воз­вра­щает пей­лоад в пер­воздан­ном виде.

Обя­затель­ный эле­мент там­пера один — фун­кция tamper(). Осталь­ное мож­но опус­тить, если это не помеша­ет скрип­ту выпол­нять свою работу.

 

Приоритеты тамперов

По­рядок, в котором ты вво­дишь спи­сок там­перов, важен. Боль­шая раз­ница — при­менить сна­чала url-encoding, а потом space2plus и наобо­рот. Фун­кция url-encoding кодиру­ет про­белы в %20, соот­ветс­твен­но, там­пер space2plus не най­дет про­белов и не вне­сет изме­нений, WAF будет про­ще обна­ружить инъ­екцию. Если исполь­зовать обратный порядок, то space2plus заменит про­белы сим­волами + , а url-encoding прев­ратит их в %2B, и WAF будет счи­тать всю стро­ку одним сло­вом: SELECT%20FROM%20USERS, а не SELECT%2BFROM%2BUSERS.

Ма­па кон­тро­лиру­ет при­ори­теты при помощи перемен­ной __priority__ и набора кон­стант PRIORITY из пакета lib.core.enums. Если не ука­жешь при­ори­тет в скрип­те, мапа авто­матом наз­начит при­ори­тет NORMAL.

Стандартные тамперы с повышенным приоритетом
Стан­дар­тные там­перы с повышен­ным при­ори­тетом
То же, но с низким приоритетом
То же, но с низ­ким при­ори­тетом

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

Когда low поставил раньше highest
Ког­да low пос­тавил рань­ше highest
 

Зависимости

Фун­кция 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, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии