SQL-инъ­екции — одна из самых при­ятных уяз­вимос­тей при пен­тесте. Но встре­чают­ся они все реже, пос­коль­ку сов­ремен­ные инс­тру­мен­ты безопас­ности без тру­да их отлавли­вают. Слож­нее быва­ет выявить инъ­екцию, которая сра­баты­вает при переда­че дан­ных меж­ду сер­висами. Сегод­ня мы погово­рим о детек­те имен­но таких SQLi — тех, что сра­баты­вают не сра­зу, а где‑то в глу­бине биз­нес‑логики.

Сна­чала раз­берем­ся с общей методо­логи­ей поис­ка мно­гоэтап­ных SQLi, затем пос­мотрим, какие встро­енные фун­кции sqlmap помогут нам в выяв­лении, а под конец напишем собс­твен­ную обер­тку для поис­ка таких инъ­екций.

warning

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

 

Как искать многоэтапные SQLi

В тес­тирова­нии мно­гоэтап­ных инъ­екций я выделяю четыре основных эта­па.

  1. Под­готов­ка. На эта­пе под­готов­ки соз­дают­ся дан­ные или объ­екты, в которые или при помощи которых будет выпол­нять­ся инъ­екция. При­мер: соз­дание чер­новика новос­ти на новос­тном пор­тале (кноп­ка «Соз­дать чер­новик») или соз­дание нового пись­ма (кноп­ка «Написать пись­мо»).
  2. Внед­рение. Этап, на котором про­исхо­дит непос­редс­твен­ное добав­ление наг­рузки в переда­ваемые дан­ные. При­мер: сох­ранение новос­ти пос­ле редак­тирова­ния.
  3. Под­твержде­ние. На этом эта­пе под­твержда­ется соз­дание объ­екта. При­мер: под­твержде­ние пуб­ликации новос­ти.
  4. Ре­зуль­тат. Здесь под­разуме­вает­ся, что есть отдель­ная стра­ница, на которой мож­но уви­деть резуль­тат сра­баты­вания инъ­екции. При­мер: стра­ница опуб­ликован­ной новос­ти.

Каж­дый этап может пред­став­лять собой нес­коль­ко зап­росов, одна­ко их суть при этом сох­раня­ется:

  1. Зап­росы перед инъ­екци­ей.
  2. Зап­рос с инъ­екци­ей.
  3. Зап­росы пос­ле инъ­екции.
  4. Про­вер­ка сра­баты­вания.

В биз­нес‑логике при­ложе­ния могут при­сутс­тво­вать не все эта­пы. Нап­ример, нет эта­па под­готов­ки: для соз­дания новос­ти может быть не нуж­но отправ­лять отдель­ный зап­рос, новость соз­дает­ся сра­зу во вре­мя редак­тирова­ния.

 

Встроенные функции в 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.py. Встав­ляем в него заготов­ку:

#!/usr/bin/env python3
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def 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

Ко­рот­ко о том, что есть в этой струк­туре:

  1. __priority__ — перемен­ная, которая поз­воля­ет опре­делить порядок tamper sqlmap, если их нес­коль­ко. Все­го сущес­тву­ет семь рег­ламен­тирован­ных зна­чений:
    • PRIORITY.LOWEST;
    • PRIORITY.LOWER;
    • PRIORITY.LOW;
    • PRIORITY.NORMAL;
    • PRIORITY.HIGH;
    • PRIORITY.HIGHER;
    • PRIORITY.HIGHEST.
  2. dependencies() — потен­циаль­но эта фун­кция пред­назна­чена для допол­нитель­ных зависи­мос­тей, но в дан­ный момент исполь­зует­ся в тем­перах толь­ко для вывода информа­ции в sqlmap:

    def dependencies():
    singleTimeWarnMessage("This is a warning from your tamper script!")
  3. 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

Так­же может быть полез­но изу­чить эти матери­алы:

 

Sqlmap eval

Наз­начение: модифи­кация зап­роса перед отправ­кой при помощи кода на Python.

Па­раметр:

--eval="#first line; #second line; #third line"

Осо­бен­ности:

  • Не име­ет дос­тупа к наг­рузке, которая будет переда­на. При замене перемен­ной наг­рузка утра­чива­ется.
  • Мо­дифи­циру­ет зап­рос каж­дый раз, ког­да отправ­ляет­ся основная наг­рузка; --second-req не модифи­циру­ется.
  • Мо­дифи­циро­вать мож­но любую часть зап­роса, в том чис­ле и URI.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

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

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

    Подписаться

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