Multi-Step SQLi. Как работают многоэтапные SQL-инъекции

Содержание статьи

  • Как искать многоэтапные SQLi
  • Встроенные функции в sqlmap для эксплуатации многоэтапных SQLi
  • Sqlmap tamper
  • Sqlmap eval
  • Sqlmap second-req/second-url
  • Краткие выводы
  • Проблемы при эксплуатации многоэтапных SQLi через sqlmap
  • Пишем свою обертку
  • Пример кода
  • Выводы

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

Сна­чала раз­берем­ся с общей методо­логи­ей поис­ка мно­гоэтап­ных 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.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

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

    • 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.

    Источник: xakep.ru

    Ответить

    Ваш адрес email не будет опубликован. Обязательные поля помечены *