Сезон распродаж

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

Удивительно, сколько проблем может сгенерировать один и тот же элемент бизнес-логики веб-приложения. В прошлый раз форма ввода номера скидочной карты позволила в теории собрать данные о пользователях программы лояльности спортивной торговой сети. Сегодня же мы препарируем сайт интернет-ретейлера одежды (естественно, вымышленного), где решили просто — форма призвана давать клиенту скидку и она с этой задачей справляется. Посмотрим на это чуть пристальнее остальных.

В отличие от уже приведённого выше примера, здесь от клиента не ожидают ничего, кроме, собственно, 8 цифр номера карты.

retailer-case0

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

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

На самом деле, долго думать вообще не пришлось. При вводе данных карты на бэкенды уходит POST, содержащий девять этажей мусорных отслеживающих кук и единственный параметр с номером проверяемой карты, условно, disCard=ХХХХХХХХ. Удаляю ненужные, на первый взгляд, куки, параллельно проверяя работоспособность запроса — сервер охотно отвечает, валидна ли карта. В конечном итоге остаётся единственная кука — PHPSESSID. Думается, ну от неё-то точно зависит возможность общаться с сервером. Удаляю её, делаю запрос — сервер отвечает, валидна ли карта и учтиво устанавливает новую куку, ведь в запросе она пустая. В итоге, остаётся всего один параметр. Referer тоже ни на что не влияет.

Как мило.

cookie

retailer-case2

retailer-case3

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

Ладно. Может, при переборе встретятся проблемы и нас будут хитро отфильтровывать и не дадут совершать наглый брутфорс?

Нет.

Ставим 1 поток и беспрепятственно перебираем 10000 номеров из первого попавшегося диапазона, среди которых около 300 действительных. Естественно, ответы с валидными картами легко отделяются от остальных.

retailer-case4

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

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