Перепись спортсменов

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

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

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

sport-case8

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

При повторном нажатии «Ok» начинает тикать таймер в 180 секунд, а при попытке ввести другую валидную карту, появляется подозрительное сообщение.

sport-case1

Burp Suite рассудит, возвращает ли бэкенд номер телефона в ответ на повторный запрос с другой валидной картой. Оказалось, что очень даже возвращает. Пока активна сессия, бэкенд охотно отвечает на запросы. Тут же был запущен интрудер, я сгенерил 200 номеров карт, среди которых точно имеется 2 валидных и решил проверить, определю ли я положительные ответы. Это оказалось тривиально.

В ответ на запрос с номером неактивной карты возвращается JSON, в котором все значения равны null, а так выглядят ответы на запросы с действующими картами:

sport-case2

sport-case3

Поскольку сходу я не придумал, как автоматизировать поддержание сессии в активном состоянии или её смену, то мне просто пришлось несколько минут смотреть велосипеды и палатки на сайте. Сервер без проблем ответил на 200 запросов. К сожалению, безумный троттлинг бесплатного Burp Suite не позволил проверить, с какой максимальной скоростью можно перебирать номера карт, но перебор однозначно возможен, если сессия будет оставаться активной.

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

sport-case5 sport-case6

Превосходно.

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

Не стоит думать, что все карты пустые 🙂

sport-case7

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

Вот такая перепись спортсменов.

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

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