Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Що таке SSRF і як захистити API, яке завантажує дані за URL від користувача?

SSRF (Server-Side Request Forgery) - зловмисник змушує ваш сервер зробити запит туди, куди йому потрібно. Типові функції-мішені: імпорт за URL, попередній перегляд посилань, вебхуки (користувач вказує URL для сповіщень), завантаження аватара за посиланням, генерація PDF з HTML.

// вразливо
$image = Http::get($request->input('avatar_url'))->body();

Що можна дістати через ваш сервер:

  • сервіси метаданих хмари: http://169.254.169.254/ - тимчасові облікові дані AWS/GCP/Azure. Класичний сценарій масштабних витоків;
  • внутрішні сервіси, недоступні ззовні: адмінки, бази з HTTP-інтерфейсом, Redis, панелі моніторингу, localhost:8080;
  • сканування внутрішньої мережі за часом відповіді;
  • файли через схеми file://, gopher:// - залежно від HTTP-клієнта.

Захист (кілька шарів, бо кожен окремо обходиться):

1. Дозволений список, а не заборонений. Якщо можна - лише відомі домени (інтеграції з конкретними сервісами).

2. Схема й порт: лише https (за потреби http), стандартні порти.

3. Перевірка IP після розв'язання DNS: заборонити приватні діапазони (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), 127.0.0.0/8, link-local 169.254.0.0/16, IPv6-аналоги (::1, fc00::/7, fe80::/10).

Пастки, через які наївна перевірка не працює:

  • DNS rebinding: домен при перевірці дає публічну адресу, а при реальному запиті - внутрішню. Перевіряти треба той IP, до якого реально підключаєтесь (зафіксувати розв'язану адресу для з'єднання);
  • редиректи: перевірений URL повертає 302 на http://169.254.169.254/. Редиректи вимкнути або перевіряти кожен крок;
  • альтернативні записи IP: http://2130706433/, http://0x7f.1/, http://[::ffff:127.0.0.1]/ - усе це 127.0.0.1.

4. Мережева ізоляція: вихідні запити до користувацьких URL - через окремий проксі чи сервіс без доступу до внутрішньої мережі й метаданих. Найнадійніший шар.

5. Хмара: IMDSv2 на AWS (сесійний токен для метаданих) робить класичну атаку значно складнішою.

6. Обмеження відповіді: тайм-аути, максимальний розмір, перевірка типу вмісту - і не повертати клієнту сирі відповіді чи детальні помилки підключення (це дає зловмиснику «сліпе» сканування).

Для вебхуків з URL від користувача - ті самі правила плюс перевірка URL при збереженні й при кожній відправці.

Докладніше в документації: OWASP API7:2023 - SSRF

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання