Содержание статьи
- Действующие лица
- Действие первое
- ***
- ***
- Действие второе
- ***
- ***
- Действие третье
- ***
- ***
IDOR — самый опасный зверь в лесу OWASP. Даже один экземпляр, попавший не в те руки, может дорого обойтись компании нашего инженера, поэтому он использует все возможности, доступные в его белом ящике, чтобы обогнать на этой охоте пентестеров, багхантеров и злоумышленников.
Действующие лица
- Дмитрий — аппсек компании «ПузонТех»
- Рамсель — багхантер
- Роман — девопс‑инженер
- Игорь — QA-лид
По просьбам выживших все имена были изменены. Из уважения к погибшим остальные события были отображены именно так, как они происходили.
Действие первое
Майское утро, солнце начинает освещать верхушки деревьев, поют соловьи. Комната с двухэтажной кроватью и рабочим столом с двумя мониторами и ноутбуком, по углам разбросаны игрушки, кубики Lego затаились, чтобы напасть на зазевавшуюся босую ногу, дверь заперта изнутри.
На столе стоит кружка кофе, от нее поднимается струйка ароматного пара. В инбоксе по баг‑баунти‑алертам одно новое сообщение.
Дмитрий: Да что там еще, неужто опять принесли пачку учеток сотрудников со стилеров, не надоедает же им…
Рамсель: Вот вам IDOR в подтверждении заказа, можно получить имя, адрес, телефон ваших клиентов и корзину, на скрине — данные произвольного клиента.
Дмитрий: О, неплохо, но у нас же там UUID везде в идентификаторах, где ты вообще взял этот ID?
Рамсель: Бро, а ты зацени веб‑архив по вашему домену!
Дмитрий: Да, валидное. Надо бы поискать у нас по логам все такие места.
Роман: Всё есть, сходи в ClickHouse, возьми аксесс‑логи по внешним балансирам.
***
Итак, у нас есть аксесс‑логи приложения, стоит фильтрануть по нашим доменам, по response status < 300 и, возможно, только по авторизованным пользователям (чтобы убрать мусор со сканеров).
Уже в скрипте отфильтруем статику.
Заменим параметры path и query заглушками и сгруппируем по полученному пути, чтобы в результате остались только уникальные ручки.
Обязательно оставим примеры сырых данных, они пригодятся дальше.
В результате из трафика у нас получится CSV.
Далее мы можем в этом файле отфильтровать результаты по колонкам path и args. Нам нужно оставить только те значения, где будут наши заглушки для всего похожего на токены или идентификаторы объектов: {uuid}, {hex}, {code} или {int}. К этому фильтру вполне можно добавить уже известные нам названия чувствительных идентификаторов, допустим тот же order_id, или auth_token, или еще что‑нибудь.
Дальше для отфильтрованных подозрительных ручек можно взять сырые значения идентификаторов из path_example и args_example, предусмотрительно сохраненные нами, склеить их обратно в полный путь и списком скопировать в словарик (Simple list) для Burp Intruder, подставив к своему GET-запросу с актуальными тестовыми кредами (или вообще без них).
Там, где в ответе нам вернется что‑то, кроме 403, — повод посмотреть, отдает ли сервер чужие данные и что в коде эндпоинта авторизации.
***
Аккуратно собрав с десяток ручек, ответивших валидными данными на запросы, Дмитрий пошел искать правильных разработчиков и заводить тикеты на исправления.
И надо поднять выплату Рамселю, много нашли проблем благодаря его репорту.
Действие второе
Прошло две недели. Офис, рабочая встреча в Zoom, все смотрят бесконечный флоу онбординга, и только одинокая муха, ползущая по схеме на мониторе, кажется, понимает, как ей стать клиентом компании.