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

Sqlmap вос­при­нима­ют как прос­тую боевую ути­литу: написал sqlmap -u ... --dbs, подож­дал, получил спи­сок баз. Вещь нас­толь­ко при­выч­ная, что ману­ал ник­то не перечи­тыва­ет. И зря! Автор выкатил за пос­ледний год два боль­ших релиза (1.9 в янва­ре 2025-го, 1.10 в янва­ре 2026-го) и с тех пор регуляр­но штам­пует минор­ные — акту­аль­ная вер­сия уже 1.10.7.

Ес­ли дав­но не обновлял мапу, перед проч­тени­ем выпол­ни

sqlmap --update

А теперь поеха­ли смот­реть новин­ки!

 

Не только SQL

Рань­ше, если инъ­екция была не в SQL-зап­росе, а, ска­жем, в LDAP-филь­тре или в шаб­лониза­торе Jinja2, sqlmap был бес­полезен — при­ходи­лось искать такое руками или брать отдель­ный инс­тру­мент. Теперь появил­ся целый новый блок клю­чей — Non-SQL injection. Это пол­ноцен­ный дви­жок с авто­мати­чес­кой детек­цией и экс­плу­ата­цией под каж­дый класс уяз­вимос­тей.

Для выбора типа уяз­вимос­ти исполь­зуют­ся соот­ветс­тву­ющие клю­чи: --nosql, --xxe и так далее. Все эти клю­чи вза­имоис­клю­чающие — на один про­гон мож­но ука­зать толь­ко один из них.

При ата­ке логика такая же, как и рань­ше: тес­тиру­ются GET/POST-парамет­ры, ата­ка на Cookie — от --level 2, ата­ка в заголов­ках вро­де User-Agent или Referer — от --level 3.

При сле­пом извле­чении через любой из этих век­торов sqlmap раз­деля­ет три сос­тояния: true, false и inconclusive. Рань­ше обрыв соеди­нения, ответ WAF, ошиб­ка бэкен­да или неод­нознач­ный ора­кул мог­ли мол­ча интер­пре­тиро­вать­ся как один из битов (false или true) — и в дамп уле­тали испорчен­ные дан­ные. Теперь такие слу­чаи получа­ют сос­тояние inconclusive и рет­раят­ся: так мож­но убе­дить­ся в отсутс­твии инъ­екции. Если пос­ле пов­торов чет­кого под­твержде­ния нет — зат­ронутое зна­чение (или стро­ка) помеча­ется как partial, а не выда­ется как дос­товер­ное.

info

Я исполь­зую два раз­ных тер­мина: NoSQL и Non-SQL. Пер­вый клас­сичес­ки озна­чает ата­ку на докумен­тоориен­тирован­ную базу дан­ных, вро­де MongoDB. Вто­рой тер­мин пред­лага­ет автор мапы. Этим тер­мином опи­сыва­ются век­торы ата­ки, отличные от чис­того SQL Injection. Не запутай­ся!

 

NoSQL

За­будь про NoSQLMap. Он справ­ляет­ся с задачей, но зачем он, если теперь у тебя есть пол­ноцен­ный дви­жок в sqlmap, который прек­расно справ­ляет­ся с NoSQL-инъ­екци­ями. Вот основные воз­можнос­ти:

  • опе­ратор­ные инъ­екции MongoDB/CouchDB ($ne, $gt и подоб­ные);
  • query_string в Elasticsearch/Solr;
  • Cypher-инъ­екции в Neo4j;
  • AQL в ArangoDB;
  • N1QL в Couchbase;
  • PartiQL в DynamoDB;
  • клас­сичес­кий $where в MongoDB.
sqlmap -u "http://siteurl.test/search?name=luther" -p name --nosql --batch

На выходе будет пей­лоад с ука­зани­ем, какой имен­но опе­ратор сра­ботал, и, если ора­кул поз­воля­ет, сра­зу in-band-дан­ные без руч­ного дам­па.

Да­вай потес­тим ата­ку на лабе Exploiting NoSQL injection to extract data. Запус­ти при­ложе­ние и нас­трой прок­сирова­ние через Burp. Авто­ризуй­ся с кре­дами wiener:peter. В исто­рии зап­росов Burp най­ди GET /user/lookup?user=wiener HTTP/2. Сох­рани рек­вест в файл — жми пра­вой кноп­кой мыши, во всплы­вающем меню най­ди Save item.

За­пус­ти sqlmap, передав файл через параметр -r:

sqlmap -r ps-lab-req -p user --nosql --level=5 --risk=3 --batch
Найдена NoSQL-инъекция
Най­дена NoSQL-инъ­екция

Не все лабы PortSwigger под­ходят для мапы. В некото­рых слу­чаях мапа не уви­дит точ­ки инъ­екции, а лаба выдаст поз­драв­ления. Часть лаб эму­лиру­ет поведе­ние NoSQL-инъ­екции и дела­ет это толь­ко на уров­не демонс­тра­ции. Не уви­дев реаль­ной инъ­екции, мапа выдаст отри­цатель­ный резуль­тат.

Лаба решена, но мапа не видит инъекции
Ла­ба решена, но мапа не видит инъ­екции
 

GraphQL

GraphQL сам по себе прос­то обер­тка, реаль­ная уяз­вимость поч­ти всег­да либо в резол­вере (SQL/NoSQL-инъ­екция), либо в самой схе­ме. Мапа теперь интрос­пекти­рует эндпо­инт, переби­рает аргу­мен­ты всех зап­росов и мутаций, находит точ­ку инъ­екции и репор­тит наход­ку как SQL/NoSQL injection via GraphQL — с ука­зани­ем тран­спор­та отдель­ной стро­кой:

sqlmap -u "http://siteurl.test/graphql" --graphql --batch

Даль­ше как обыч­но: фин­гер­принт бэкен­да, --dbs, --tables, --dump. Если инъ­екции нет в query-полях, sqlmap про­верит и mutation-сло­ты, но с ого­вор­кой: для мас­сового извле­чения задей­ству­ются толь­ко «read-подоб­ные» мутации (login, verify, token) — дес­трук­тивную мутацию най­дет и покажет, но экс­плу­ати­ровать не ста­нет.

Важ­ный момент имен­но в век­торе. Здесь не вый­дет получить резуль­тат, ата­куя лабы PortSwigger. Те лабы не заточе­ны под SQL- или NoSQL-уяз­вимос­ти. Луч­ше подой­дет Damn Vulnerable GraphQL Application.

Вы­пол­ни для запус­ка:

git clone https://github.com/dolevf/Damn-Vulnerable-GraphQL-Application.git
cd Damn-Vulnerable-GraphQL-Application
docker build -t dvga .
docker run -t -p 5013:5013 -e WEB_HOST=0.0.0.0 dvga

Про­верь, что при­ложе­ние дос­тупно на http://localhost:5013/. Если все окей, выпол­ни ата­ку:

sqlmap -u "http://localhost:5013/graphql" --graphql --batch
Найденная уязвимость
Най­ден­ная уяз­вимость
 

LDAP и XPath

LDAP-филь­тры и XPath-зап­росы годами были сле­пой зоной sqlmap, хотя инъ­екции в них встре­чают­ся регуляр­но — осо­бен­но в кор­поратив­ных LDAP-бин­дах авто­риза­ции и в ста­ром легаси на XML/XSLT.

sqlmap -u "http://192.168.30.7/ldap/search?q=x" --ldap --batch
sqlmap -u "http://192.168.30.7/xpath/search?q=x" --xpath --batch

Ес­ли у цели есть in-band-утеч­ка (типич­ный сце­нарий для LDAP-катало­гов, где резуль­тат поис­ка прос­то рен­дерит­ся на стра­ницу), sqlmap выг­ребет записи целиком — dn, cn, mail, uid, даже userPassword, если он в откры­том виде. Если ора­кул чис­то булев — дви­жок всле­пую переби­рает каталог запись за записью и атри­бут за атри­бутом.

Для XPath то же самое: пол­ноцен­ный блай­ндо­вый обход все­го XML-дерева с вос­ста­нов­лени­ем имен эле­мен­тов, атри­бутов и тек­сто­вого содер­жимого, с огра­ниче­нием по глу­бине (по умол­чанию 32 уров­ня, что­бы не закопать­ся в рекур­сии).

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

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

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

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

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

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

    Подписаться

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