Действующие лица
- Дмитрий — аппсек компании «ПузонТех»
- Рамсель — багхантер
- Роман — девопс‑инженер
- Игорь — QA-лид
info
По просьбам выживших все имена были изменены. Из уважения к погибшим остальные события были отображены именно так, как они происходили.
Действие первое
Майское утро, солнце начинает освещать верхушки деревьев, поют соловьи. Комната с двухэтажной кроватью и рабочим столом с двумя мониторами и ноутбуком, по углам разбросаны игрушки, кубики Lego затаились, чтобы напасть на зазевавшуюся босую ногу, дверь заперта изнутри.
На столе стоит кружка кофе, от нее поднимается струйка ароматного пара. В инбоксе по баг‑баунти‑алертам одно новое сообщение.
Дмитрий: Да что там еще, неужто опять принесли пачку учеток сотрудников со стилеров, не надоедает же им...
Рамсель: Вот вам IDOR в подтверждении заказа, можно получить имя, адрес, телефон ваших клиентов и корзину, на скрине — данные произвольного клиента.
Дмитрий: О, неплохо, но у нас же там UUID везде в идентификаторах, где ты вообще взял этот ID?
Рамсель: Бро, а ты зацени веб‑архив по вашему домену!
![](https://static.xakep.ru/images/27955fa19bbc1899e21f53223afc549e/37498/image11.png)
Дмитрий: Да, валидное. Надо бы поискать у нас по логам все такие места.
Роман: Всё есть, сходи в ClickHouse, возьми аксесс‑логи по внешним балансирам.
***
Итак, у нас есть аксесс‑логи приложения, стоит фильтрануть по нашим доменам, по response status < 300 и, возможно, только по авторизованным пользователям (чтобы убрать мусор со сканеров).
Уже в скрипте отфильтруем статику.
![](https://static.xakep.ru/images/27955fa19bbc1899e21f53223afc549e/37500/image1.png)
Заменим параметры path
и query
заглушками и сгруппируем по полученному пути, чтобы в результате остались только уникальные ручки.
![](https://static.xakep.ru/images/27955fa19bbc1899e21f53223afc549e/37491/image7.png)
![](https://static.xakep.ru/images/27955fa19bbc1899e21f53223afc549e/37497/image12.png)
Обязательно оставим примеры сырых данных, они пригодятся дальше.
В результате из трафика у нас получится CSV.
![](https://static.xakep.ru/images/27955fa19bbc1899e21f53223afc549e/37496/image2.png)
Далее мы можем в этом файле отфильтровать результаты по колонкам path
и args
. Нам нужно оставить только те значения, где будут наши заглушки для всего похожего на токены или идентификаторы объектов: {
, {
, {
или {
. К этому фильтру вполне можно добавить уже известные нам названия чувствительных идентификаторов, допустим тот же order_id
, или auth_token
, или еще что‑нибудь.
Дальше для отфильтрованных подозрительных ручек можно взять сырые значения идентификаторов из path_example
и args_example
, предусмотрительно сохраненные нами, склеить их обратно в полный путь и списком скопировать в словарик (Simple list) для Burp Intruder, подставив к своему GET-запросу с актуальными тестовыми кредами (или вообще без них).
![](https://static.xakep.ru/images/27955fa19bbc1899e21f53223afc549e/37488/burp.png)
![](https://static.xakep.ru/images/27955fa19bbc1899e21f53223afc549e/37487/burp-1.png)
Там, где в ответе нам вернется что‑то, кроме 403, — повод посмотреть, отдает ли сервер чужие данные и что в коде эндпоинта авторизации.
***
Аккуратно собрав с десяток ручек, ответивших валидными данными на запросы, Дмитрий пошел искать правильных разработчиков и заводить тикеты на исправления.
И надо поднять выплату Рамселю, много нашли проблем благодаря его репорту.
Действие второе
Прошло две недели. Офис, рабочая встреча в Zoom, все смотрят бесконечный флоу онбординга, и только одинокая муха, ползущая по схеме на мониторе, кажется, понимает, как ей стать клиентом компании.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее