Перейти к содержимому

Поиск по платформе

Access Control: Горизонтальная эскалация через API в Express

API-эндпоинт /api/users/:user_id/notes не проверяет владельца. Получите заметки администратора.

Автор: Hack & Fix
Освоишь: RBACpolicy testsdeny-by-default
Средне+60 XP ~30 мин nodejs
CWE-284 · A01:2021 Pro
Обложка: Access Control: Горизонтальная эскалация через API в Express Обложка: Access Control: Горизонтальная эскалация через API в Express
Задача
# Горизонтальная эскалация: чужие заметки через REST API ## Сценарий Вы аудируете **Quantro** — сервис командных заметок на Express: у каждого сотрудника личная страница, и фронтенд подгружает записи из REST API. В службу безопасности обратился уволенный тестировщик: он утверждал, что читал чужие заметки, лишь поменяв число в адресе запроса. Руководство просит подтвердить или опровергнуть эти слова. ## Цель 1. Войдите под обычным аккаунтом и найдите API-эндпоинт, который отдаёт заметки пользователя — подсмотрите его в сетевых запросах на странице заметок. 2. Подмените идентификатор владельца в адресе запроса и подтвердите, что сервер отдаёт чужие заметки. 3. Доберитесь до заметок администратора и извлеките CTF-флаг из их содержимого. ## Теория Broken Object-Level Authorization (OWASP API1), в обиходе — IDOR: эндпоинт проверяет аутентификацию (есть ли валидная сессия), но не авторизацию на конкретный ресурс (можно ли этому пользователю читать именно эти данные). Идентификатор владельца приходит из самого запроса, и сервер доверяет ему безоговорочно. **Уязвимый паттерн:** ```javascript // Идентификатор владельца берётся из пути, а не из сессии: const userId = parseInt(req.params.user_id, 10); const notes = db.prepare( 'SELECT id, title, content, created_at FROM notes WHERE user_id=?' ).all(userId); ``` Обработчик честно требует сессию, но затем выбирает заметки по идентификатору из адреса запроса, который полностью контролируется клиентом. Достаточно подставить чужое значение — и API вернёт чужие записи. ## Точка входа атаки `GET /api/users/:user_id/notes` — JSON-эндпоинт списка заметок; числовой идентификатор владельца передаётся прямо в пути. Вход в приложение — `POST /login` с полями `username` и `password`. * **Обычный пользователь:** `demo` / `demo`

Похожие лабораторные (4)

другие лабы по этой уязвимости
Обложка лабы: Access Control: Forced Browsing — скрытая админ-панель Обложка лабы: Access Control: Forced Browsing — скрытая админ-панель
Access

Access Control: Forced Browsing — скрытая админ-панель

Административные страницы доступны без аутентификации. Перейдите напрямую и получите конфиденциальные данные.

+30 XP
Node.js Pro
Exploit Fix
Обложка лабы: Access Control: обход URL-проверки через вариации пути Обложка лабы: Access Control: обход URL-проверки через вариации пути
Access

Access Control: обход URL-проверки через вариации пути

Middleware проверяет доступ к /admin по точному совпадению префикса. Обойдите проверку, изменив регистр символов.

+30 XP
Node.js Pro
Exploit Fix
Обложка лабы: Horizontal Privilege Escalation: изменение профиля другого пользователя Обложка лабы: Horizontal Privilege Escalation: изменение профиля другого пользователя
Access

Horizontal Privilege Escalation: изменение профиля другого пользователя

Обработчик обновления аватара принимает user_id из формы вместо сессии -- атакующий может изменить профиль любого пользователя, включая администратора.

+60 XP
Go Pro
Exploit Fix
Обложка лабы: URL Case Bypass: обход проверки пути с помощью регистра Обложка лабы: URL Case Bypass: обход проверки пути с помощью регистра
Access

URL Case Bypass: обход проверки пути с помощью регистра

Middleware проверяет путь с учётом регистра (strings.HasPrefix). Замена /admin на /Admin позволяет обойти проверку роли администратора.

+60 XP
Go Pro
Exploit Fix