Как я случайно обнаружил возможное бесконечное пополнение счёта у своего американского сотового оператора

в 1:07, , рубрики: информационная безопасность, операторы, платежные системы, реверс-инжиниринг, связь, уязвимости

В целях недопущения злоупотеблениями я не указываю имя оператора.

Всё началось с того, что я купил по приезду SIM-карточку оператора с тарифным планом Pay-as-you-go. Это самый обычный тарифный план, которые были популярны в России до появления пакетных тарифных планов, то есть платишь за каждую минуту, сообщение, мегабайт, при этом у тебя есть баланс, который необходимо пополнять.

Везде у меня был Wi-Fi, а сотовая связь скорее была нужна для входящих звонков и редких выходов в мобильный Интернет. Однако проблема американских операторов, что твой баланс на счёте может просто истечь. Тут он истекал через 30 дней, то есть деньги на счёте просто сгорали. Его можно было целиком перенести на следующий месяц, но для этого нужно было сделать хоть какое-то пополнение счёта. Я решил делать минимальные пополнения, чтобы оставаться на связи.

Я зашёл в Аккаунт на сайте оператора и попробовал сделать пополнение с банковской карточки. В отличии от России тут сумму ввести было нельзя. Мне предлагали на выбор всего несколько сумм, минимальная $5. Мне столько было не нужно, но я платил эти деньги каждый месяц, чтобы оставаться на связи. В итоге через несколько месяцев на счёте накопились «бесполезные» несколько десятков долларов без шансов их когда либо потратить.

Проходя как-то мимо торговой точки оператора в одном из торговых центров я увидел обычные карточки пополнения (скретч-карты). Они были таких же номиналов, как и мне предлагали для оплаты на сайте. Но видимо из-за своей интуитивной тяги к экспериментам я решил приобрести такую карточку, опять же на $5. Когда наступил момент оплаты, я стал рассматривать карточку. Вроде такой же принцип как в России (когда эти карточки ещё были популярны): можно просто набрать команду с номером карточки и активировать её, а можно «бродить» по USSD-меню (команды из разряда *XXX#). Опять же из-за какого-то желания экспериментировать, я решил выбрать долгий путь с меню. Среди опций предлагалось узнать баланс, активировать скретч-карту, пополнить счёт с банковской карты.

В России я как-то всегда имел только дело с вводом данных карты в онлайн, поэтому оплата картой через такое меню была для меня интересной (в конце концов эти платежи были темой моего диплома), хотя казалось небезопасной (опять же в России обычно данные водятся в отдельном окне банка-эквайера, а не передаются продавцу в открытом виде), я решил попробовать. Сразу же меня удивило предложение ввести сумму. То есть мне не предлагали стандартный выбор сумм, как везде, а предлагали именно ввести сумму. Я выбрал $1, ввёл данные карты в следующих шагах и оплата прошла. Как несложно догадаться, дальше я попробовал ввести $0.01, это прошло тоже.

Можно было обрадоваться, что мне не надо теперь бесполезно переводить каждый месяц по $5 на свой баланс, а тратить всего 1 цент и завершить эксперимент. Но спустя пару часов мне захотелось снова посмотреть Аккаунт на сайте оператора и опции пополнения.

Итак. Мне предлагают заполнить форму с данными карты, суммой и так далее. Отслеживаю, как выглядит этот POST-запрос с отправкой формы. Копирую, вставляю в Postman, пытаюсь повторить запрос. Сервер отвечает ошибкой, похоже истекают какие-то токены в форме.

Решаю идти простым путём. Мне же предлагают выбрать сумму из выпадающего списка. Конечно это какой-то select со списком option.

<select class="selectpicker select form-control show-tick text field" title="Specify an amount.." id="billing_amount" name="billing_amount">
<option class="bs-title-option" value=""></option>
<option value="REG10-5">$5</option>
<option value="REG11-10">$10</option>
<option value="REG12-30">$30</option>
</select>

На сервер очевидно отправляется только value. Что значит 5, 10, 30 после дефиса мне понятно, это сумма пополнения, но что значит первое значение? Есть ли также какие-то константы в исходном коде или сумма просто извлекается из полученных данных?

Пробую. Выставляю REG12-0.01 у одного из пунктов, ввожу данные карты, отправляю. Появляется сообщение: «Thank you. $0.01 load amount has been credited to your prepaid number». Эта же сумма списалась с карты. Кажется всё отлично. Можно выбирать любую сумму, хотя я и так раньше обнаружил эту возможность через USSD, никакой проблемы.

Но тут самый главный момент. Мне приходит SMS-сообщение на номер: "$30 was credited to your account". Баланс счёта увеличивается на эту сумму.

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

Автор: AndreyKovalevsky

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js