SSRF: Redirect Bypass
Обработчик загрузки аватара проверяет IP начального URL, но requests.get() автоматически следует редиректам — внешний сервер перенаправляет на внутренний адрес.
mediumpythonPro
Задача
# SSRF: обход фильтра через HTTP-редиректы
## Сценарий
Перед вами Flask-приложение интернет-магазина SecureShop с функцией загрузки аватара по URL — пользователь подаёт ссылку, сервер скачивает изображение и сохраняет его как аватар. Эта функция, как и любая «дай-серверу-сделать-HTTP-запрос-по-моему-URL», классически подвержена SSRF.
В отличие от базовой SSRF-уязвимости, разработчик уже знал про класс проблемы и **добавил фильтр** — перед запросом проверяется, что хост URL не относится к loopback или приватным сетям. Однако фильтр неполноценный: он проверяет одну точку, тогда как HTTP-запрос — это в общем случае последовательность шагов. Между «фильтр одобрил» и «сервер реально подключился к внутреннему ресурсу» всё ещё есть зазор, который можно эксплуатировать.
Дополнительно фильтр содержит «удобство для разработки»: список доверенных внутренних hostname'ов, которые пропускаются без IP-проверки (типичный enterprise-паттерн — `prometheus.internal`, `auth-service.local`, etc.). Если такой trusted-сервис умеет редиректить на произвольный URL (даже непреднамеренно — через эндпоинт партнёрского трекинга, OAuth callback и т.п.), вся защита разваливается.
Ваша задача — понять, что именно фильтр упустил из виду, и использовать это, чтобы дотянуться до внутреннего сервиса с CTF-флагом.
## Цели
1. Авторизуйтесь как `demo` / `demo` и найдите функцию загрузки аватара по URL.
2. Сначала убедитесь, что прямые обращения к адресам из приватных диапазонов фильтр действительно блокирует.
3. Найдите способ заставить сервер всё равно обратиться к внутреннему ресурсу, формально не подавая в фильтр «локальный» URL.
4. Извлеките CTF-флаг из ответа внутреннего сервиса.
## Данные
| Параметр | Значение |
|----------|----------|
| Обычный пользователь | `demo` / `demo` |
> Подсказка: в инфраструктуре есть «доверенный» внутренний сервис, который умеет отвечать HTTP-редиректом на адрес из query-параметра — он создан как helper для SSRF-лаб, но точно так же мог бы появиться в реальной системе как partner-tracking endpoint. Найдите его в фильтре и попробуйте использовать.