A01: Broken Access Control

Уязвимость №1 рейтинга OWASP 2021 — когда пользователь делает то, что ему не положено.

Broken Access Control — нарушение контроля доступа: приложение не проверяет (или проверяет неверно), имеет ли пользователь право на запрашиваемое действие или данные.

Это самая распространённая категория уязвимостей. Суть проста: аутентификация отвечает на вопрос «кто ты», а авторизация — «что тебе можно». Когда второй вопрос забывают задать, начинаются проблемы.

IDOR: доступ к чужому объекту

Классический пример — Insecure Direct Object Reference. Пользователь видит свой заказ по адресу вида /orders/123. Если, поменяв число на 124, он увидит чужой заказ — значит, сервер не проверяет, принадлежит ли заказ запросившему.

GET /orders/123   -- мой заказ, всё ок
GET /orders/124   -- а это уже чужой заказ; сервер обязан проверить владельца

Обход проверок и повышение прав

Другие проявления: обычный пользователь обращается к админскому эндпоинту /admin/users; проверка прав есть только на фронтенде (кнопка скрыта, но запрос проходит); права берутся из изменяемого клиентом поля (например, роль в cookie или в теле запроса).

Как защищаться

  • Проверяйте авторизацию на сервере для каждого запроса — не полагайтесь на скрытие элементов интерфейса.
  • Запрещайте по умолчанию (deny by default): доступ открывается явной проверкой, а не отсутствием запрета.
  • Проверяйте владение объектом: «принадлежит ли заказ #124 текущему пользователю?».
  • Не доверяйте роли/идентификатору, пришедшим от клиента; берите их из проверенной серверной сессии или подписанного токена.
  • Логируйте отказы в доступе и следите за всплесками — это признак перебора.
// Псевдокод серверной проверки
order = bd.najti(orderId)
if (order == null) return 404
if (order.ownerId != currentUser.id AND !currentUser.isAdmin) return 403
vernut(order)

Частые ошибки разработчиков

  • Проверяют только, что пользователь вошёл (аутентификация), но не что ему можно (авторизация).
  • Полагаются на «никто не догадается поменять id в URL» — безопасность через неясность не работает.
  • Берут роль пользователя из тела запроса или cookie, которые клиент может подделать.

Итог

  • Access Control = проверка прав на каждое действие на сервере.
  • IDOR — доступ к чужому объекту через подмену идентификатора.
  • Deny by default и проверка владения объектом закрывают большинство случаев.
Проверьте себя
1. Пользователь меняет /orders/123 на /orders/124 и видит чужой заказ. Это пример...
AXSS
BIDOR (Broken Access Control)
CSQL-инъекции
DCSRF
2. Где обязательно проверять права доступа?
AТолько на фронтенде (скрыть кнопку)
BНа сервере для каждого запроса
CВ базе данных через триггеры
DДостаточно проверки при логине
3. Что означает принцип deny by default в контроле доступа?
AВсё разрешено, пока явно не запрещено
BДоступ закрыт, пока явно не разрешён проверкой
CДоступ есть только у админов
DДоступ зависит от времени суток