IDOR: Доступ к чужому счету
Эндпоинт просмотра счета не проверяет владельца. Получи флаг из счета другого пользователя.
easygolangPro
Задача
# IDOR: доступ к чужому ресурсу через предсказуемый ID
## Сценарий
Вы зарегистрировались в интернет-магазине как пользователь **alice**. В личном кабинете есть раздел «Счета» (инвойсы): каждый счёт открывается по URL с числовым идентификатором, а список собственных счетов отображается на главной странице раздела. Команда уверена, что endpoint защищён аутентификацией и пользователь видит только свои счета. По данным внутреннего отчёта, в системе есть счёт администратора с описанием, содержащим конфиденциальную метку — её требуется извлечь в рамках аудита.
## Цель
1. Залогиньтесь как `alice` и изучите URL-схему доступа к собственным счетам.
2. Используя предсказуемый формат идентификатора, обратитесь к счёту, не принадлежащему текущему пользователю.
3. Найдите флаг в полях счёта администратора.
## Теория
IDOR (Insecure Direct Object Reference) — класс уязвимостей, при которых приложение использует пользовательский ввод как прямую ссылку на ресурс БД (числовой ID, имя файла, ключ объекта) и проверяет факт аутентификации, но **не проверяет авторизацию** — то есть принадлежит ли запрошенный ресурс текущему пользователю. Стандартный признак уязвимости — последовательные числовые идентификаторы (1, 2, 3, ...), что превращает атаку в простой перебор.
**Уязвимый паттерн:**
```go
// Запрос фильтрует только по ID ресурса, без привязки к пользователю
row := db.QueryRow("SELECT ... FROM invoices WHERE id=?", id)
```
При наличии валидной сессии любого пользователя такой запрос возвращает данные любого ресурса, существующего в системе. Атака требует только аутентификации (которая часто бесплатна — регистрация открыта), без обхода защитных слоёв.
## Точка входа атаки
| Параметр | Значение |
|----------|----------|
| Учётные данные | `alice` / `alice123` |
| Список своих счетов | `GET /invoices` |
| Счёт по ID | `GET /invoices/{id}` |