SSRF (Server-Side Request Forgery) - нападник змушує ваш сервер зробити запит туди, куди йому самому не дістатися: до внутрішніх сервісів, адмінок без авторизації, метаданих хмари.
Типові функції-мішені: імпорт аватара за URL, попередній перегляд посилання, вебхуки з адресою від користувача, конвертація HTML у PDF.
// Вразливо: адресу задає користувач
$image = Http::get($request->input('avatar_url'))->body();
// avatar_url = http://169.254.169.254/latest/meta-data/iam/security-credentials/
// → сервер віддасть тимчасові ключі хмари
Інші цілі: http://localhost:6379 (Redis без пароля), http://10.0.0.5:8080/admin, file:///etc/passwd у бібліотеках, що підтримують інші схеми.
Захист:
- Білий список, якщо можливо: дозволені лише конкретні домени.
- Лише
http/https, жоднихfile:,gopher:,ftp:. - Перевірка IP після резолву DNS: відхиляти приватні діапазони (
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16),127.0.0.0/8,169.254.0.0/16, IPv6-аналоги. Перевіряти саме той IP, до якого піде з'єднання, - інакше обхід через DNS rebinding (домен спершу резолвиться в публічну адресу, а при з'єднанні - у внутрішню). - Редиректи: вимкнути або перевіряти кожен, бо
https://evil.exampleможе перенаправити наhttp://127.0.0.1. - Мережева ізоляція: вихідні запити через окремий проксі чи сервіс без доступу до внутрішньої мережі.
- У хмарі - IMDSv2 на AWS (вимагає токен, який SSRF зазвичай не отримає).
Таймаути й ліміт розміру відповіді - теж обов'язкові, інакше функцію можна використати для навантаження на сервер.