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