Basic SSRF: Доступ к админке
Простая SSRF-уязвимость, позволяющая получить доступ к внутренним ресурсам сервера.
easygolangPro
Задача
# SSRF: запрос к внутреннему эндпоинту через серверный HTTP-клиент
## Сценарий
Вы зарегистрированы в интернет-магазине как пользователь **demo**. На странице профиля доступна функция загрузки аватара по URL: пользователь указывает адрес изображения, а сервер сам скачивает картинку и сохраняет копию. Команда уверена, что эндпоинт безопасен — это просто прокси для скачивания внешних ресурсов. По данным внутреннего аудита, в приложении есть административный эндпоинт со статистикой и сервисной информацией, доступный только с loopback-интерфейса; в его ответе раскрывается конфиденциальная метка, которую требуется извлечь.
## Цель
1. Изучите эндпоинт «скачать аватар по URL» и поведение серверного HTTP-клиента: что именно сервер делает с пользовательским URL.
2. Используя серверный HTTP-клиент как прокси, обратитесь к административному эндпоинту, защищённому проверкой IP источника запроса.
3. Извлеките флаг из ответа административного эндпоинта.
## Теория
SSRF (Server-Side Request Forgery) — класс уязвимостей, при котором атакующий заставляет сервер выполнять HTTP-запрос по адресу, выбранному атакующим. Запрос исходит **от сервера**, поэтому имеет привилегии серверной сети: проходит файрволы, видит внутренние эндпоинты, использует loopback-интерфейс, а в облачных средах получает доступ к metadata-сервисам. SSRF превращает уязвимое приложение в proxy внутри доверительной границы.
**Уязвимый паттерн:**
```go
// Сервер делает запрос по URL, переданному пользователем, без проверки адреса
url := r.FormValue("url")
resp, _ := http.Get(url)
```
Ключевая ошибка — отсутствие проверки destination перед вызовом HTTP-клиента. Многие эндпоинты во внутренней инфраструктуре доверяют сетевой границе («доступно только с localhost», «доступно только из VPN», «доступно только из k8s-кластера»), но SSRF её обходит, потому что запрос всегда исходит из самой сети — от лица серверного процесса.
## Точка входа атаки
`POST /fetch-avatar` — форма профиля принимает поле `url`, по которому сервер скачивает изображение аватара.
* **Учётные данные:** `demo` / `demo`
* **Цель:** заставить сервер обратиться к внутреннему эндпоинту со статистикой и получить флаг из ответа.