РАЗБОР На проверке

Инструменты веб-пентеста 2026: рабочий стек

Сергей Попов
Сергей Попов Red Team · 6,8 тыс. сообщений
Подписаться
187
[ обложка статьи ]
Режим чтения
Ноутбук на тёмном антистатическом коврике, на экране светится схема из шести инструментов пентеста, соединённых стрелками на фоне глубокого графитового пространства.


На последних пяти engagement'ах - SPA на Next.js, финтех-API c GraphQL-мутациями, два корпоративных портала на .NET и legacy-монолит на PHP - стек не менялся: Burp Suite, Katana, FFUF, Nuclei, SQLmap, Dalfox. Шесть тулз, связанных bash-пайплайном в одну цепочку от recon до верификации. Ни один DAST в автоматическом режиме не находил того, что давала эта связка: IDOR через подмену UUID в GraphQL-мутации, слепую SQL-инъекцию в параметре сортировки за WAF, reflected XSS в callback-URL OAuth-потока. Каждый инструмент закрывает конкретную фазу. Ценность - в цепочке, а не в отдельной тулзе.

Почему именно эти шесть инструментов веб-пентеста​

Каждый год в подборках мелькают двадцать-тридцать инструментов для пентеста веб-приложений. На практике бóльшая часть дублирует друг друга, а на реальном engagement'е нужен стек пентестера, где каждый элемент делает одну вещь хорошо и передаёт результат следующему. Критерий отбора простой: инструмент остаётся в арсенале, если за последние 12 месяцев он участвовал в обнаружении хотя бы трёх подтверждённых находок на разных проектах. Не «может найти» - а нашёл. Подробнее - в нашем материале про пентест веб-приложений.

ИнструментРоль в стекеФаза MITRE ATT&CKВерсияПочему не заменяем
KatanaJS-aware краулинг, карта эндпоинтовActive Scanning (T1595, Reconnaissance)Текущий релиз ProjectDiscoveryЕдинственный краулер, корректно разбирающий React/Next.js роутинг
FFUFФаззинг директорий, параметров, vhost'овWordlist Scanning (T1595.003, Reconnaissance)Текущий релиз GitHubСкорость + гибкость фильтров -ac, -fs, -fw
NucleiШаблонное сканирование CVE и мисконфиговVulnerability Scanning (T1595.002, Reconnaissance)3.11.19000+ шаблонов + кастомные за 15 минут
Burp Suite ProПерехват, Repeater, Intruder, расширенияExploit Public-Facing Application (T1190, Initial Access)2026.4.3+Расширения: JWT Editor, Autorize, Param Miner
SQLmapОбнаружение и эксплуатация SQL-инъекцийInjection (A03:2021)git HEAD (Python 2.7/3.x)Tamper-скрипты для WAF bypass + все СУБД
DalfoxВерификация XSS с контекстным анализомInjection (A03:2021)Текущий релиз GitHubКонтекстные payload'ы + headless-браузер + blind callback

Что осталось за скобками и почему:

Nmap - сетевой инструмент (Network Service Discovery, T1046), а не веб-специфичный. На web-engagement'е порт-скан и fingerprinting обычно закрыты на этапе скоупинга. Если нужно - добавляю nmap -sV точечно, но в ежедневный pipeline он не входит.

ZAP - пересекается с Burp по функциям прокси. Как DAST в CI/CD - отличный выбор (по данным backdoor.tech, ZAP лучше Burp для автоматизации в пайплайнах), но для ручного пентеста уступает Burp Pro по расширениям и active scanner.

Caido - перспективный Rust-прокси с чистым UX и HTTPQL для фильтрации трафика. На части проектов использую параллельно с Burp. Но набор расширений пока не дотягивает до BApp Store, и по данным secra.es, зрелые команды держат оба инструмента, а не переключаются полностью.

Metasploit - exploitation framework для сетевых и инфраструктурных атак (более 2000 exploit-модулей по данным Rapid7). На web-engagement'ах практически не нужен.

Разделение принципиально: стек собран под web application penetration testing, а не под сетевой пентест или red team. Все шесть покрывают путь от разведки поверхности атаки до подтверждения уязвимости - и на bug bounty программах этот же набор закрывает полный цикл от recon до отправки отчёта.

Recon-фаза: Katana краулер и FFUF​

Разведка поверхности атаки - фаза, которую половина пентестеров пропускает или ограничивает одним gobuster. На modern-стеке с SPA и API-first архитектурой это приговор: бóльшая часть эндпоинтов не видна без JS-рендеринга и целевого фаззинга веб-приложений.

Katana - краулер для SPA​

Katana от ProjectDiscovery - open-source краулер, который корректно обрабатывает SPA. Ключевой флаг - -js-crawl: Katana поднимает headless-браузер, рендерит JavaScript, вытаскивает маршруты из React Router, lazy-loaded модулей и fetch-вызовов. По данным cyberfortify.co, именно Katana «extracts endpoints from SPA apps that traditional spiders miss entirely». На практике подтверждаю - классические краулеры на SPA слепы как кроты.

Типичный запуск: katana -u https://target.com -js-crawl -depth 3 -known-files all -o endpoints.txt. Флаг -known-files all автоматически проверяет robots.txt, sitemap.xml, .well-known - на трёх последних проектах это давало 15-30 дополнительных эндпоинтов, которых не было в UI.

Результат - текстовый список URL с полными путями и параметрами, извлечёнными из JS-кода. Этот список напрямую уходит в FFUF и Nuclei.

Где Katana сливается: глубокие multi-step flows с CSRF-токенами и stateful-сессиями. Если приложение требует авторизацию - без кастомных заголовков Katana увидит только публичную часть. Workaround: передавать cookie или Bearer-токен через -H "Authorization: Bearer <token>". Не идеально, но работает.

FFUF Dalfox Katana - фаззинг после краулинга​

FFUF закрывает то, что Katana не видит: скрытые директории без ссылок из UI, забытые API-эндпоинты, параметры за пределами документации. По MITRE ATT&CK это Wordlist Scanning (T1595.003) и File and Directory Discovery (T1083).

Для directory fuzzing: ffuf -u https://target.com/FUZZ -w /opt/seclists/Discovery/Web-Content/raft-large-words.txt -ac -mc 200,204,301,302,401,403 -o ffuf-dirs.json -of json. Флаг -ac (auto-calibration) - штука критически важная: FFUF сам определяет размер стандартного ответа и отсекает false positive. Без -ac на приложениях с custom 404-страницами получите тысячи мусорных результатов. Проверено, к сожалению, на собственном опыте.

Для parameter fuzzing: ffuf -u "https://target.com/api/v1/users?FUZZ=1" -w /opt/seclists/Discovery/Web-Content/api/objects.txt -fw 0 -mc 200. Флаг -fw 0 фильтрует ответы с нулевым количеством слов - пустые ответы, которые обычно означают «параметр не распознан».

На engagement'ах за WAF - обязательно ограничивать скорость: -rate 5 или -rate 10. На одном проекте с Cloudflare стандартные 40 req/s блокировались через 200 запросов; -rate 5 позволил прогнать весь словарь без бана. Для API-эндпоинтов полезны словари Assetnote - swagger-wordlist.txt покрывает типовые пути REST API.

Nuclei сканер уязвимостей: шаблоны как оружие​

Nuclei от ProjectDiscovery - шаблонный сканер, который за последние два года превратился из утилиты для проверки CVE в полноценный фреймворк автоматизации веб-пентеста. Mapping по MITRE ATT&CK - Vulnerability Scanning (T1595.002, Reconnaissance).

Главное преимущество перед DAST типа ZAP или Burp Active Scanner: полный контроль над каждым запросом через YAML-шаблоны. Каждый шаблон - спецификация: какой HTTP-запрос отправить, какие заголовки подставить, какой ответ считать индикатором уязвимости. Никакой магии, чистая декларативность.

Стандартный прогон по результатам разведки: nuclei -l endpoints.txt -severity critical,high -es info,low -stats -o nuclei-findings.json -jsonl. Флаг -es info,low отсекает информационные и низкоприоритетные шаблоны - на типичном target'е это убирает 80% шума.

Кастомные шаблоны - главная сила Nuclei. Допустим, при ручном анализе в Burp обнаружили BOLA/IDOR (API1:2023 по OWASP API Security Top 10): приложение возвращает данные другого пользователя при подмене ID. Вместо ручной проверки каждого эндпоинта - пишем шаблон и прогоняем по всей поверхности:
YAML:
id: idor-user-profile
info:
  name: IDOR - User Profile Access
  severity: high
  tags: idor,bola,auth
http:
  - raw:
      - |
        GET /api/v2/users/{{user_id}}/profile HTTP/1.1
        Host: {{Hostname}}
        Authorization: Bearer {{token_low_priv}}
    payloads:
      user_id: ["1","2","1001","admin"]
    matchers-condition: and
    matchers:
      - type: status
        status: [200]
      - type: word
        words: ["email","phone"]
        condition: or
Запуск: nuclei -t idor-user-profile.yaml -V token_low_priv="eyJhbG..." -u https://target.com. Написание такого шаблона - 10-15 минут. Окупается на каждом следующем engagement'е с похожим стеком.

Момент про безопасность самого Nuclei: в версии 3.8.0 закрыли уязвимость чтения локальных файлов через JavaScript-шаблоны и утечку переменных окружения при флаге -ev. С версии 3.11.0 кастомные шаблоны с протоколом javascript: нужно подписывать командой nuclei -sign - иначе движок их молча пропустит. Официальные community-шаблоны уже подписаны. Актуальная версия - 3.11.1. Проверять безопасность приложения дырявым инструментом - так себе идея. Обновляйте и шаблоны, и движок.

Burp Suite: центр ручного анализа​

Burp Suite Pro - осевой инструмент стека. Не потому что «так принято», а потому что ни один автоматический сканер не заменяет ручную работу с логикой авторизации. По данным OWASP Top 10 2021, Broken Access Control (A01:2021) обнаружен у 94% протестированных приложений. Находится он руками, а не шаблонами.

Repeater - основная рабочая область. Перехватил запрос в Proxy, отправил в Repeater, поменял user_id с 1001 на 1002 - смотришь ответ. Broken Access Control вылезает именно так: через подмену идентификаторов, удаление заголовков авторизации, изменение HTTP-методов. Просто и грубо. Работает.

Три расширения, без которых не начинаю engagement:

Autorize - автоматически прогоняет каждый запрос с токеном низкопривилегированного пользователя и без токена, помечая расхождения в правах. На проектах с 50+ эндпоинтами экономит день ручной проверки access control. День. Целый.

JWT Editor - редактирование claims прямо в Repeater: подмена alg:none, атака RS256→HS256, JWK injection. На одном финтех-engagement'е JWT без валидации подписи дал полный доступ к admin-функционалу. Расширение позволило проверить это за минуту.

Param Miner - обнаружение скрытых параметров и заголовков. Находит X-Forwarded-Host, X-Original-URL и прочие заголовки, которые приложение обрабатывает, но не документирует. Security Misconfiguration (A05:2021) часто прячется именно здесь.

Версия: начиная с 2026.4 у Community и Professional общий установщик. Ставить нужно не ниже 2026.4.3 - в ней закрыта уязвимость браузерного краулинга под Windows (по данным PortSwigger). Burp работает локально, Docker не нужен.

Про Burp Suite альтернативы в 2026 году: Caido на Rust обрабатывает тот же объём трафика без JVM-тормозов и предлагает HTTPQL для фильтрации (req.method == "POST" AND req.body.cont("user_id")). На SPA-проектах, где каждое действие генерирует десятки API-запросов, держу Caido параллельно для быстрого поиска по истории. Но полный переход - пока рано: расширений уровня Autorize или JWT Editor у Caido нет.

SQLmap и Dalfox: точечная эксплуатация​

SQLmap инструкция для работы за WAF​

SQLmap - инструмент для подтверждения и эксплуатации SQL-инъекций. Поддерживает MySQL, PostgreSQL, MSSQL, Oracle, SQLite, MariaDB - практически все СУБД, встречающиеся на engagement'ах. Но в 2026 году запускать sqlmap -u "url" --dbs в лоб - гарантированный бан. WAF стоит на каждом production-приложении, и тупой брутфорс он давит за секунды.

Рабочий подход: сначала обнаружить подозрительную точку в Burp (нетипичная задержка при подстановке ', разница в ответе при 1 AND 1=1 vs 1 AND 1=2), сохранить запрос в файл через «Copy to file» в Repeater, затем передать в sqlmap:

sqlmap -r request.txt --tamper=between,randomcase,space2comment --delay=2 --random-agent --level=3 --risk=2 --technique=BT --dbms=PostgreSQL

Разбор ключевых флагов:

--technique=BT - ограничивает boolean-blind и time-based техниками. Они генерируют меньше подозрительного трафика, чем UNION-based или error-based. WAF реже срабатывает на задержки, чем на синтаксические SQL-конструкции.

--dbms=PostgreSQL - если СУБД уже определена через fingerprinting или ошибки, этот флаг сокращает количество запросов на порядок. SQLmap не будет перебирать payload'ы для MySQL, Oracle и SQLite. Очевидно - но регулярно вижу, как гоняют sqlmap без --dbms и удивляются бану.

--tamper=between,randomcase,space2comment - цепочка tamper-скриптов для обхода WAF. between заменяет > на NOT BETWEEN 0 AND, randomcase рандомизирует регистр, space2comment заменяет пробелы на /**/.

--delay=2 - пауза 2 секунды между запросами. Без этого флага на rate-limited target'ах sqlmap забанят после сотни запросов.

Эксплуатация SQL-инъекций через sqlmap - это не «запустил и забыл». Ручная подготовка точки инъекции в Burp, передача контекста в sqlmap с точными параметрами, а после подтверждения - документирование PoC с минимальным доказательством импакта. Выгружать production-базу только ради подтверждения находки не нужно - --dump -T users --start=1 --stop=3 хватит за глаза для демонстрации.

Сканер XSS Dalfox: контекстные payload'ы и blind callback​

Dalfox - специализированный инструмент для верификации XSS, который закрывает разрыв между «нашёл потенциальный reflected input» и «подтвердил эксплуатируемый XSS». Ни Nuclei, ни Burp Active Scanner не делают это с такой точностью: Dalfox анализирует контекст вставки (HTML-тег, атрибут, JavaScript-блок, URL) и генерирует payload'ы именно под этот контекст.

Запуск: dalfox url "https://target.com/search?q=test" --blind https://your.xss.collector --waf-evasion -o dalfox-findings.json.

Три вещи, которые стоит знать:

--blind - отправляет payload'ы с callback на указанный сервер для обнаружения stored и blind XSS. На одном engagement'е blind XSS через callback нашёлся в поле «Имя пользователя» admin-панели - payload выполнился при просмотре списка юзеров администратором. Никакой reflected-сканер этого бы не увидел. Находка, которая оправдывает существование Dalfox в стеке.

--waf-evasion - встроенные техники обхода WAF: encoding, case variation, alternative event handlers.

Headless-браузер для DOM XSS - Dalfox рендерит страницу и проверяет, выполняется ли payload в реальном DOM. Это убирает false positive на modern-фреймворках с auto-escaping (React, Angular), которые Burp Active Scanner генерирует пачками.

Почему Dalfox, а не Burp для XSS: Burp находит reflected XSS, но без рендеринга страницы не может отличить reflected input (payload в HTML-ответе) от exploitable XSS (payload выполняется в браузере). На React-приложениях эта разница - десятки false positive. Время на разбор мусора тратить жалко.

Pipeline: связываем стек пентестера в одну цепочку​

Главная ценность - не отдельные инструменты, а автоматизация переходов между ними. Ниже - bash-скрипт, который прогоняет цикл от краулинга до шаблонного сканирования за один запуск. Ручная фаза (Burp, SQLmap, Dalfox) начинается после, когда pipeline сформировал target list с первичными находками.
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме

После отработки pipeline - открываю nuclei.json, фильтрую по severity, каждый finding проверяю руками в Burp Repeater. Confirmed - документирую PoC с точными шагами воспроизведения. False positive - отмечаю и иду дальше. Подозрительные параметры с потенциальной инъекцией - в SQLmap. Точки отражения пользовательского ввода - в Dalfox.

На типичном engagement'е pipeline покрывает 60-70% поверхности атаки за 30-40 минут. Оставшиеся 30-40% - ручная работа в Burp: проверка access control через Autorize, тестирование JWT-токенов, бизнес-логика. Это реальное соотношение «автоматика vs ручная работа» на коммерческих engagement'ах и в bug bounty. Автоматика находит паттерны. Человек строит цепочку.

Когда инструменты сливаются: таблица ограничений​

Ни один инструмент для пентеста веб-приложений не является серебряной пулей (кто бы что ни писал в README). Ниже - конкретные сценарии, где каждый из шести инструментов проигрывает. Знание слепых зон экономит часы на engagement'е.

ИнструментСлепая зонаWorkaround
KatanaStateful flows с CSRF-токенами, multi-step wizardsПередавать session cookie через -H; для авторизованных зон - Burp Spider
FFUFCustom 404 с динамическим контентом; без -ac - тысячи false positiveВсегда -ac; калибровать вручную через -fs и -fw
NucleiBusiness-logic (IDOR, race conditions) - стандартные шаблоны не покрываютКастомные шаблоны + ручная проверка в Repeater
Burp SuiteJVM-тормоза на SPA с большим объёмом трафикаCaido параллельно для фильтрации истории
SQLmapWAF с жёстким rate limiting; NoSQL-инъекции (MongoDB) не поддержаны--tamper + --delay; для NoSQL - ручные payload'ы
DalfoxCSP со strict-dynamic: реальный XSS не эксплуатируемПроверять CSP до запуска; CSP Evaluator

Чего нет ни в одном из шести - и что с этим делать:

GraphQL-специфичное сканирование. Ни Nuclei, ни FFUF не анализируют GraphQL-схемы с глубиной вложенности и batching-атаками. Для GraphQL добавляю curl с introspection-запросом и InQL расширение для Burp: curl -s -X POST -H "Content-Type: application/json" -d '{"query":"{__schema{types{name fields{name}}}}"}' https://target.com/graphql | python3 -m json.tool - это даёт карту типов и мутаций для ручного анализа.

JWT-атаки за пределами стандартных. Для полного покрытия JWT-вектора (alg:none, RS256→HS256 confusion, key injection) - jwt_tool от ticarpi: python3 jwt_tool.py <TOKEN> -M pb прогоняет весь playbook автоматически.

WebSocket и SSE. Ни один из шести инструментов не фаззит WebSocket-соединения на уровне отдельных фреймов. Burp перехватывает WebSocket, но Intruder к ним не применим. На таких проектах приходится писать кастомные Python-скрипты. Больная тема, и готового решения пока нет.

Стек из шести тулз - не скрижали. Через год Caido, возможно, дорастёт до замены Burp Pro на части проектов. Кто-то выпустит краулер лучше Katana для GraphQL subscriptions. Но принцип не поменяется: ценность - в цепочке между инструментами, а не в их количестве. Один подтверждённый IDOR через pipeline «Katana → FFUF → Nuclei → Burp Repeater» стоит больше, чем 500 информационных findings от DAST в авторежиме.

Две тенденции, которые сдвинут этот стек к 2027 году. Первая - AI-ассистенты внутри инструментов: Burp AI Scanner и ZAP Copilot уже ускоряют triage и генерацию payload'ов, но на практике это 20-30% ускорения рутины, а не замена аналитика. Вторая - API-first архитектуры вытесняют классический web, и инструменты вроде Dalfox будут терять долю в пользу специализированных API-фаззеров с gRPC и WebSocket. Но одно не изменится: автоматика находит паттерны, цепочку строит человек. Кто не умеет руками собрать атаку от recon до confirmed finding - тому не поможет ни один AI-агент. Если интересно посмотреть как цепочка работает на живом стенде - web-задачи на HackerLab дают именно эту практику чейнинга от разведки до эксплуатации.
Сергей Попов
Автор материалаСергей Попов
OSINT, Веб-безопасность
Полезно

Комментарии

0