От Open Redirect до Account Takeover

Иногда небольшие баги, которые часто встречаются в проектах, при совместной эксплуатации могут привести к критичным последствиям. Например, уязвимости IDOR и XSS, в совокупности с неправильной настройкой CSP, могут быть использованы для обхода защиты и захвата учетных записей пользователей.

Рассмотрим один из таких проектов – сервис, через который доступна покупка услуг, где эксплуатация нескольких уязвимостей с невысоким импактом привела к захвату аккаунтов. 

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

Обнаруженные уязвимости

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

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

Так была обнаружена первая уязвимость — IDOR (Insecure Direct Object Reference). Оказалось, что пользователь, зная идентификатор чужой заявки, может добавить в неё собственный комментарий. При этом проверка прав доступа на стороне сервера либо отсутствует, либо реализована некорректно.

Для эксплуатации такой уязвимости достаточно отправить следующий запрос:

Следующей найденной уязвимостью стала Stored XSS, обнаруженная также в комментариях к заявкам. Полезная нагрузка, добавленная в комментарий, сохранялась и обрабатывалась при открытии заявки. Дальше появилась идея: а что если попробовать использовать уязвимость IDOR в связке с Stored XSS, чтобы внедрить вредоносный скрипт не просто в свой комментарий, а в комментарий к чужой заявке?

Пример такого запроса, в котором происходит эксплуатация сразу двух уязвимостей выглядит следующим образом:

Однако, эксплуатация XSS уязвимости осложнялась наличием Content Security Policy – HTTP-заголовка, который сообщает браузеру, что разрешается выполнение скриптов только из ограниченного списка источников.

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

В ходе дальнейшего изучения была обнаружена уязвимость Open Redirect, позволяющая перенаправить пользователя на внешний сервис:

https://site.ru/auth?redirect=//deteact.com

Content Security Policy и её недостатки

В ходе дальнейшего исследования выяснилось, что политику CSP в приложении можно обойти, поскольку в директиве script-src не указан флаг strict-dynamic, а разрешён список источников, из которых могут выполняться скрипты. Также присутствует флаг unsafe-eval, что позволяет использовать конструкции вроде eval() или Function().

Мы обратили внимание на то, что в список “разрешённых” источников попал сайт yastatic.net, откуда загружаются скрипты Яндекса:

Библиотека AngularJS версии 1.6.4, которая также доступна для скачивания с этого домена, может быть использована для внедрения вредоносного кода. AngularJS версии 1.6.x позволяет использовать expression-синтаксис прямо в HTML-атрибутах. А если есть unsafe-eval — можно сделать даже eval() через expression внутри тега <i>:

<code><i ng-app>{{$on.constructor('alert(1)')()}}</i>

Мы можем подключить этот JS-файл, используя обнаруженную уязвимость Open Redirect. Согласно спецификации CSP, браузер будет игнорировать путь, указанный после редиректа. О данной особенности можно почитать подробнее — https://www.w3.org/TR/CSP3/#source-list-paths-and-redirects.

Ниже продемонстрирована полезная нагрузка, позволяющая полноценно провести эксплуатацию XSS уязвимости, обойдя при этом политику CSP:

<iframe srcdoc="<script src='https://site.ru/auth?redirect=https://yastatic.net/s3/milab/js/angular.min.js'></script><i ng-app>{{$on.constructor('alert(origin)')()}}</i>"></iframe>

Перехват учетных данных

Сами по себе уязвимости IDOR + XSS + CSP — не уникальны и достаточно часто встречаются в веб-приложениях. Но в данном случае интерес представляет то, как эти уязвимости можно было использовать в процессе SSO-авторизации.

Пошаговая эксплуатация:

1. В комментарий к чужой заявке через уязвимость IDOR вставляется следующую полезную нагрузку:

Декодированный пэйлоад из eval:

2. На этом этапе вставляются четыре cookie (a, b, c, d) по 4095 байт, чтобы перегрузить заголовки запроса. Такой подход называют cookie bomb — техника, когда создаются огромные cookie специально для того, чтобы превысить лимит размера HTTP-заголовков. Сервер, получив такой запрос, просто не может его корректно обработать и вместо нормального ответа возвращает ошибку. В результате — не происходит ни перенаправления, ни очистки URL, а code и session остаются прямо в адресной строке.

3. Далее инициализируется процесс SSO путем добавления iframe с URL https://site.ru/auth?redirect=/.

После перехода по нему, сервер пытается обработать code и session, однако, из-за переполнения заголовков возникает ошибка.

4. Так как данные (code, session) все еще находятся в URL, вредоносный код может вытащить их и отправить на внешний сервер:

5. Если злоумышленник успеет открыть полученный URL в течение 5 секунд, он сможет инициировать авторизацию под жертвой, получив полноценный доступ к аккаунту

Заключение

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

Пентест

Вы можете нанять одну из лучших команд хакеров в мире для проведения тестирования на проникновение.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *