Information Disclosure: Открытый debug-эндпоинт
Debug-эндпоинт раскрывает переменные окружения и список пользователей без аутентификации
easygolangPro
Задача
# Открытый Debug-эндпоинт: утечка переменных окружения и пользовательских данных
## Сценарий
Вы внешний исследователь, изучающий публичную часть интернет-магазина **SecureShop**. Команда оставила в приложении служебный эндпоинт для диагностики, который при разработке выводил переменные окружения процесса и список зарегистрированных пользователей. По данным внутреннего аудита, этот эндпоинт остался зарегистрированным в production-сборке без защиты — анонимный пользователь без логина может получить доступ к рантайм-конфигурации, включая флаг лабы.
## Цель
1. Найдите служебный диагностический эндпоинт приложения и определите, какая аутентификация (если есть) к нему применяется.
2. Изучите формат и содержимое ответа: какие именно категории данных раскрываются — конфигурация, секреты, пользователи, профайлинг.
3. Извлеките флаг лабы из ответа эндпоинта и проверьте альтернативный путь — использовать утёкшие данные для входа под привилегированной учётной записью.
## Теория
Уязвимости класса **Information Disclosure / Debug Endpoint Exposure** возникают, когда диагностические/служебные маршруты остаются зарегистрированными в production. Класс знаком по реальным фреймворкам: Django `DEBUG=True` показывает stack trace + locals; Spring Boot Actuator `/actuator/env` выгружает все переменные окружения; Go `net/http/pprof` регистрирует `/debug/pprof/*` через side-effect import; Express.js `NODE_ENV=development` включает подробные ошибки. CWE-215 «Insertion of Sensitive Information into Debugging Code», CWE-489 «Active Debug Code», OWASP A05:2021 «Security Misconfiguration».
**Уязвимый паттерн:**
```go
// Debug-эндпоинт зарегистрирован без middleware и без env-гейта
mux.HandleFunc("GET /debug", func(w http.ResponseWriter, r *http.Request) {
for _, e := range os.Environ() {
fmt.Fprintln(w, e) // дамп всех ENV в HTTP-ответ
}
})
```
Опасность не в самом факте «отладочного» вывода, а в комбинации: (1) маршрут зарегистрирован неконтролируемо во всех окружениях; (2) у него нет проверки роли/IP/токена; (3) в ответ попадают переменные процесса, в которых хранятся секреты (`LAB_FLAG`, `LAB_ADMIN_PASS`, `DATABASE_URL`, `SECRET_KEY`). Любая из трёх проблем сама по себе — снижение качества; их совмещение — дыра, через которую анонимный клиент сразу получает компрометацию.
## Точка входа атаки
| Параметр | Значение |
|----------|----------|
| Авторизация | не требуется (анонимный доступ) |
| Диагностический эндпоинт | `GET /debug` (без middleware, без проверки IP/токена) |
| Цель | извлечь флаг из ответа эндпоинта или войти под admin, используя утёкшие credentials |