IDOR: Mass Assignment — эскалация привилегий через профиль
Эндпоинт обновления профиля принимает JSON и записывает все поля, включая role. Отправь {"role":"admin"} и получи доступ к админ-панели с флагом.
mediumgolangPro
Задача
# IDOR: Mass Assignment — эскалация привилегий через обновление профиля
## Сценарий
Вы зарегистрированы в интернет-магазине как пользователь **demo**. В личном кабинете есть форма редактирования профиля, которая отправляет данные на API-эндпоинт `POST /profile/update`. Команда уверена, что эндпоинт безопасен: пользователь обновляет только свой профиль, входная схема контролируется фронтендом, валидные сессии проверяются. По данным внутреннего аудита, флаг хранится в зоне, доступной только администраторам — её требуется получить, имея только обычную учётную запись.
## Цель
1. Изучите запрос обновления профиля и определите, какие поля приходят от фронтенда.
2. Найдите способ передать API данные сверх формы — поля, не предусмотренные интерфейсом, но интерпретируемые сервером.
3. Получите доступ к административной зоне приложения и извлеките флаг.
## Теория
Mass Assignment (массовое присваивание) — класс уязвимостей, при котором обработчик HTTP-запроса декодирует входное тело (JSON, form-data, XML) напрямую в **доменную модель** или ORM-сущность, не ограничивая набор разрешённых полей. Если в модели присутствуют чувствительные атрибуты (роль, баланс, статус активации, флаги привилегий), атакующий может включить их в запрос и записать произвольное значение — даже если в UI-форме таких полей нет.
**Уязвимый паттерн:**
```go
// Декодирование тела запроса напрямую в доменную модель пользователя
var update models.User
json.NewDecoder(r.Body).Decode(&update)
db.Exec("UPDATE users SET ... WHERE id=?", update.Field1, update.Field2, ..., user.ID)
```
Атака не требует обхода аутентификации или сложных техник — достаточно просмотреть структуру модели приложения (часто доступна в исходниках, JS-bundle, OpenAPI-спеке) или подобрать имя атрибута по конвенции (`role`, `is_admin`, `permissions`, `verified`, `balance`). Через DevTools, curl или Burp атакующий отправляет JSON с дополнительным полем — и сервер прозрачно его применяет, потому что код доверяет схеме входящего payload.
## Точка входа атаки
| Параметр | Значение |
|----------|----------|
| Учётные данные | `demo` / `demo` |
| Обновление профиля | `POST /profile/update` (JSON) |
| Цель привилегированного доступа | `GET /admin` |