IDOR: Вертикальная эскалация привилегий
Админ-эндпоинты /admin/stats и /admin/users/delete проверяют аутентификацию, но не авторизацию. Любой залогиненный пользователь может получить флаг.
easygolangPro
Задача
# IDOR: вертикальная эскалация привилегий через незащищённые админ-эндпоинты
## Сценарий
Вы зарегистрированы в интернет-магазине как обычный пользователь **demo**. В приложении есть административный раздел: основная админ-панель (`/admin`) и набор служебных API для статистики и управления пользователями. Команда уверена, что весь admin-функционал защищён ролевой проверкой и доступен только администраторам. По данным внутреннего аудита, в одном из административных ответов раскрывается конфиденциальная метка — её требуется извлечь, имея только обычную учётную запись.
## Цель
1. Залогиньтесь как `demo` и изучите, какие административные ресурсы существуют в приложении (по структуре главной страницы, JS-кода, статических ассетов, известных конвенций).
2. Найдите admin-эндпоинт, к которому ролевая проверка применена непоследовательно или забыта.
3. Получите доступ к административному функционалу с правами обычного пользователя и извлеките флаг из ответа.
## Теория
Вертикальная эскалация привилегий (vertical privilege escalation) — частный случай IDOR, когда пользователь с низкими правами получает доступ к функционалу более привилегированной роли (admin, owner, super-user). В отличие от горизонтальной эскалации (доступ к чужому ресурсу того же уровня), вертикальная даёт доступ к **типу** функциональности, недоступной по роли. Самая частая ошибка — несогласованная защита: команда добавляет ролевую проверку к UI-странице (`/admin`), но забывает применить её к связанным API-эндпоинтам (`/admin/api/*`, `/admin/data`), которые часто пишутся другим разработчиком или в другой момент времени.
**Уязвимый паттерн:**
```go
// Маршрут защищён только аутентификацией, но не авторизацией
mux.Handle("GET /admin/stats", h.AuthMiddleware(h.AdminStats))
```
С точки зрения атакующего — достаточно зарегистрировать (или иметь) обычный аккаунт, получить валидную сессию, и обратиться к admin-эндпоинту напрямую (через DevTools, curl, Burp), минуя UI-страницу с ролевой проверкой. Ответ содержит данные, которые UI отрисовывает только администраторам.
## Точка входа атаки
| Параметр | Значение |
|----------|----------|
| Учётные данные | `demo` / `demo` |
| Главная админ-страница | `GET /admin` (защищена ролью — для разведки) |
| Кандидаты на уязвимость | служебные admin-эндпоинты (стат-API, операции над пользователями) |