Я нашел способ изменить стоимость услуги премиум-подписки и купил ее за копейки. Вот как я это сделал.

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

Ищите цифры

Взламывая частную программу вознаграждения за обнаружение ошибок SaaS, я прошел через воронку регистрации новых пользователей и ввел тестовую карту на странице оплаты. Платеж, конечно же, не прошел, и поэтому я вернулся, чтобы просмотреть все запросы и ответы, полученные в Burp в ходе этого процесса. Подписка, которую я пытался приобрести через веб-сайт, представляла собой премиальную услугу платформы за 19,99 фунтов стерлингов в месяц.

Я заметил, что запрос на покупку с помощью токена транзакции моей кредитной карты включал строку «package_id»: «target:payments:packages:1205». В ответ я получил строку «срок»: «ежемесячно», «цена»: {«сумма»: 1999, «валюта»: «GBP»}. Сумма была месячной стоимостью подписки, 19,99 фунтов стерлингов в пенсах. Также подтвердилось, что подписка была ежемесячной. Мое внимание привлек числовой идентификатор в параметре package_id. Мне было любопытно посмотреть, смогу ли я найти какие-либо другие действительные идентификаторы пакетов, и если да, то с какими ценами и условиями оплаты они были связаны.

Тысячи неудачных платежей позже

Используя Burp Suite Intruder, я повторил свой неудачный платежный запрос 10 000 раз, начиная с «цель: платежи: пакеты: 1» и увеличивая идентификатор до «цель: платежи: пакеты: 10000». Хотя многие запросы завершались ошибкой с сообщением «пакет не найден», я смог найти сотни прошлых и будущих цен, все еще перечисленных в их таблице цен,

Самый дорогой был 49,99 фунтов стерлингов в месяц. Самый дешевый был 0,01 фунта стерлингов как в месяц, так и в год. Бинго. Теперь все, что мне нужно было сделать, это подтвердить, что платеж действительно работает, и я мог создать реальную подписку с указанным номером пакета.

Оплата

Вооружившись номером package_id по цене 0,01 фунта стерлингов в год, я вернулся к процессу регистрации нового пользователя в Интернете и включил перехват прокси-сервера Burp Suite как раз в тот момент, когда собирался ввести свои платежные данные. На этот раз, однако, я ввел свои настоящие данные кредитной карты и вручную переадресовал полученные запросы, пока снова не увидел строку «package_id»: «target:payments:packages:1205». В этот момент я изменил SKU 1205 на годовой SKU за 0,01 фунта стерлингов и нажал вперед, а затем отключил перехват прокси-сервера Burp Suite.

К моему удивлению, это сработало, и я только что купил годовую подписку на 239,88 фунтов стерлингов за пенни. Я вернулся в свою учетную запись, проверил свою подписку и подтвердил, что являюсь премиум-подписчиком. Дата окончания моего контракта была 12 месяцев спустя.

Почему компании используют тестовые SKU

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

В этом случае похоже, что целевая компания создала ежемесячную и годовую подписку по цене 0,01 фунта стерлингов каждая, чтобы сотрудники могли протестировать систему оплаты в реальном времени после развертывания кода. Хотя это довольно распространено, эти дешевые SKU обычно не видны публично или их легко угадать, и они зарезервированы для использования сотрудниками.

Влияние

Эта ошибка может иметь большие финансовые последствия с точки зрения упущенной выгоды. Если бы это стало достоянием общественности, все их существующие клиенты могли бы отменить свои подписки и продлить их за 0,01 фунта стерлингов, что обойдется в целевые 239,87 фунтов стерлингов на клиента в год. Новые клиенты могут подписаться за копейки, потеряв весь будущий доход, пока SKU не будет отключен. Плата в 1 пенс, вероятно, даже не покрывает комиссию за транзакцию по кредитной карте.

Рекомендуемое исправление

Лучший способ исправить это, сохраняя при этом возможность для тестировщиков тестировать свою платежную систему, — добавить третье значение к каждому SKU для Enabled: True или False. Таким образом, команда может активировать SKU стоимостью 0,01 фунта стерлингов для тестирования, совершить покупку, а затем установить для них значение False в базе данных приложения, чтобы такие люди, как я, не могли ими злоупотреблять.

Код обработки платежей необходимо обновить, чтобы считывать значение свойства Enabled из базы данных и отменять любые транзакции, пытающиеся использовать отключенный SKU, рекомендуя Stripe не завершать платеж за представленный токен.

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

Первоначально опубликовано на https://craighays.com 11 августа 2021 г.