SSRF: от локального файла до метадаты облака
SSRF — это когда сервер сам, добрым слогом, тащит ресурс по URL, который ты ему подсунул, вместо легитимного https://example.com/image.jpg. По OWASP A10:2021 и CWE-918 это работает на трёх фронтах: слив данных, обход контроля доступа и (если повезёт) выполнение команд. WAF тут — не стена, а приглашение на танец, если фильтр не понимает редиректы и странные схемы URL.
Точка входа: где искать дырку
Ищи любой функционал, где приложение сам ходит по URL, который ты контролируешь хотя бы частично — webhooks, генерация превью, импорт по ссылке, SSO-callback, PDF-рендеринг. Признак живой SSRF: подставляешь свой callback-сервер, ждёшь пинг — если пришёл, поздравляю, у тебя Full или Blind SSRF, зависит от того, видишь ли ответ в теле. Базовые payload’ы для разведки:
http://127.0.0.1/admin— локалхост-панели, о которых забыли закрыть доступ снаружиhttp://localhost:9200/_cat/indices?v— привет, незащищённый Elasticsearchfile:///etc/passwd— если приложение путает файл и URL, оно радостно вернёт содержимое
Локальный файл: первый трофей
Через схему file:// можно читать всё, до чего у процесса есть права доступа: /etc/passwd, конфиги, SSH-ключи — в терминах MITRE это T1005, Data from Local System. Классический тестовый запрос выглядит так:
GET https://example.com/page?page=file:///etc/passwd
Это работает, когда параметр отдаёт содержимое напрямую в ответ, а не просто делает HTTP-запрос. Дальше — сканируем внутреннюю сеть через тот же уязвимый параметр: перебор портов на 127.0.0.1 и подсетях 192.168.x.x/10.x.x.x через Burp Intruder, группируя ответы по кодам и таймингу.
От локалхоста к облаку
Вот где начинается настоящий джекпот. Если жертва крутится в облаке, самый лакомый адрес — 169.254.169.254, link-local Instance Metadata Service, доступный без авторизации в базовой конфигурации.
| Облако | Эндпоинт метадаты | Что забираем |
|---|---|---|
| AWS EC2 | http://169.254.169.254/latest/meta-data/iam/security-credentials/ |
IAM-роль и временные access/secret ключи |
| Общий IMDS | http://169.254.169.254/latest/meta-data/ |
Информация об инстансе, сети, user-data |
| User-data | http://169.254.169.254/latest/user-data |
Скрипты запуска, иногда с секретами в переменных |
Дальше это уже Credential Access по MITRE (T1552.005) — с украденными IAM-токенами ты не просто читаешь файлик, ты можешь дёргать AWS API от имени скомпрометированного инстанса и разгуливать по всему облачному аккаунту. Именно поэтому в 2021 SSRF внесли в OWASP Top 10 отдельным пунктом — раньше недооценивали масштаб атаки.
Обход фильтров и WAF
Если базовый payload режут — не сдавайся, это только начальный уровень пентеста. В 2026 актуальны техники DNS rebinding (домен резолвится в разное на проверке и на запросе), баги парсинга URL (http://evil.com@169.254.169.254/), редирект-цепочки (302 с внешнего сервера на metadata) и обход через альтернативные представления IP (десятичный, octal, IPv6-mapped). AWS в ответ придумали IMDSv2 с обязательным токеном через PUT-запрос — это уже не просто GET на метадату, а хоп с session token, что режет большинство наивных SSRF-цепочек.
Как это фиксить (для протокола)
Дырку лучше закрыть, чем оставить открытой для конкурентов. Базовый чек-лист защиты:
- Разрешать только нужные схемы (http/https), рубить
file://,gopher://,dict://на входе - Валидировать и резолвить URL до отправки запроса, блокировать приватные и link-local диапазоны (включая 169.254.169.254)
- Переходить на IMDSv2 в AWS и аналогичные защищённые версии метадаты в GCP/Azure
- Сегментировать сеть, ставить firewall-правила deny-by-default для исходящих запросов приложения
- Минимизировать IAM-права инстанса — даже если SSRF сработает, украденный токен не должен открывать всё облако
Похожие статьи

GraphQL: интроспекция включена, безопасность — нет

BOLA/IDOR в REST API: итерируй всё подряд и молчи
