В минувшем году OWASP обновил список TOP-10 самых распространенных векторов атак на современные веб-приложения. Этот список претерпел ряд изменений по сравнению с его последней редакцией, которая была в далеком 2017 году. В связи с чем мне бы хотелось рассказать о наиболее серьезной угрозе современных веб-приложений, которая перешла с пятого на первое место, а именно про A01:2021-Broken Access Control.

Не сомневаюсь, что все прекрасно знают о том, что авторизация предоставляет пользователю права на выполнение определённых действий, а также процесс проверки (подтверждения) данных прав при попытке выполнения этих действий. Авторизация не эквивалентна аутентификации. После успешной аутентификации авторизация определяет, к каким функциям и данным может получить доступ пользователь, обеспечивая при этом надлежащее разграничение прав доступа.

Именно поэтому веб-приложению необходимы средства контроля доступа, позволяющие его пользователям использовать веб-приложение с различными привилегиями. Контроль доступа — это применение ограничений на то, кто (или что) может выполнять различные функции и получать доступ к запрошенным ресурсам. Нарушенный контроль доступа часто встречающаяся и часто критическая уязвимость в системе безопасности. Существуют несколько типов контроля доступа, равно как и уязвимостей, связанных с их нарушением :

  1. Вертикальный контроль доступа.

  2. Горизонтальный контроль доступа.

  3. Контекстно-зависимый контроль доступа.

Вертикальный контроль доступа

Механизмы вертикального контроля доступа, используются для ограничения доступа к разным функциям веб-приложения, в зависимости от типа пользователя. Например, администратор может изменять или удалять учетную запись любого пользователя, в то время как обычные пользователи не имеют доступа к этим функциям.

В некоторых случаях часть важной функциональности веб-приложения не защищена должным образом, а всего лишь скрыта, путем замены стандартных URL-адресов типа «http://website.com/administrator» на менее предсказуемый URL-адрес, например, «http://website.com/admin_2022_page». Данный способ это так называемая безопасность за счет неизвестности. Простое сокрытие важных функций не обеспечивает эффективного контроля доступа, поскольку обычные пользователи все равно могут обнаружить подобный URL-адрес различными способами. Например, URL-адрес может быть раскрыт в JavaScript коде, который создает пользовательский интерфейс на основе роли пользователя.

В данном примере, в случае если переменной isAdmin присвоено значение отличное от false, с использованием JavaScript кода в тело html-страницы будет добавлена ссылка на панель администрирования «/admin-qymd4x». Обнаружив подобную уязвимость вертикального контроля доступа обычный пользователь, выступающий как злоумышленник, может получить нелегитимный доступ к административной панели веб-приложения.

Горизонтальный контроль доступа

Механизмы горизонтального контроля доступа предназначены для ограничения доступа к выделенным ресурсам исходя из прав доступа каждого отдельно взятого пользователя. Используя горизонтальный контроль доступа разные пользователи могут получать доступ к множеству ресурсов одного и того же типа. Например, банковское веб-приложение позволяет пользователям просматривать транзакции и совершать платежи со своего собственного счета, но не со счетов других пользователей. Нарушение горизонтального контроля доступа предполагает получение доступа к правам другой учетной записи с аналогичными привилегиями.

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

 https://mybankingapp.test/cgi-bin/hpe.py?accountId=4462

Исходя из запроса становится понятно, что данные передаются методом GET в открытом виде, при этом текущий пользователь имеет идентификатор «accountId» равный 4462.  Пользователь изменяет параметр «accountId» с 4462 на 4463 и отправляет запрос.

 https://mybankingapp.test/cgi-bin/hpe.py?accountId=4463

В результате такого запроса в ответе веб-приложению передадутся данные учетной записи другого пользователя.

 {«Идентификатор счета»: 4463, «Баланс»: 130 719,92 рублей, «ФИО»: Здвижков Д.В.}

Таким образом нарушение горизонтального контроля доступа предполагает у злоумышленника наличие той же роли, что и у других пользователей, но с возможностями получения несанкционированного доступа к личным данным других пользователей.

Контекстно-зависимый контроль доступа

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

Контекстно-зависимый контроль доступа не позволит пользователю выполнять действия в неправильном порядке. Например, веб-приложение розничной торговли может запретить пользователям изменять содержимое своей корзины покупок после совершения платежа, так как это явная ошибка бизнес-логики, связанная с нарушением контроля доступа.

Существует множество реализаций механизмов контроля доступа. Представленные примеры лишь малая часть, которой, однако, должно хватить для общего понимания того, что же такое контроль доступа и зачем он нужен. Спасибо за внимание.

Комментарии (1)


  1. uyrij
    11.03.2022 07:26
    +1

    Вы или название поменяйте, или содержание (лучше целиком)