Как необычные решения приводят к критическим уязвимостям. Или история одного бага, найденного в CloudTips

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Привет, Хабр! В данной статье хотел бы поделиться историей, как был найден достаточно простой в исполнении баг, но приводящий к опасной уязвимости веб приложения. Данный баг был найден в сервисе CloudTips от Тинькофф и CloudPayments на BugBounty площадке app.bugbounty.bi.zone.

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

Чтобы воспользоваться сервисом, нужно использовать поддомен lk.cloudtips.ru. При успешной регистрации нас встречает страница нашего личного кабинета.

Основной функционал сервиса CloudTips позволяет создавать свои страницы для перевода донатов (так называемые paymentpages), а также привязка этих страниц к QR-кодам, которые позволяют официантам их демонстрировать для перевода чаевых.

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

  1. Выберем пункт «QR-Визитка» в левой панели личного кабинета QR-визитка. Видим, что по умолчанию у каждого пользователя присутствует одна ссылка для получения денег вместе с QR-кодом. Перейдем по ссылке и увидим внешний вид нашего paymentpage

Видим, что по умолчанию у каждого пользователя присутствует одна ссылка для получения денег вместе с QR-кодом. Перейдем по ссылке и увидим внешний вид нашего paymentpage.

  1. Но что делать, если нам нужно создать новую страницу для переводов? CloudTips представляет нам эту возможность. Для этого выберем пункт «Мои ссылки» и дальше «Создать ссылку». Нас встретит интерфейс, позволяющий сделать страницу для переводов с огромным количеством параметров, которые можно редактировать:

  • backgroundId (Фоновое изображение)

  • title (название страницы)

  • backgroundUrl (фоновое изображение страницы оплаты)

  • paymentMessage (Текст на странице оплаты)

  • successMessage (Текст на странице успешной оплаты)

  • minimal (минимальная сумма платежа)

  • maximal (максимальная сумма платежа) и так далее

Таким образом, создается новая страница для перевода денег вместе с QR-кодом, ведущим непосредственно на эту страницу.

Начало самого интересного

Мое внимание привлекла ссылка, которая генерируется самим сервисом, а именно уникальный ID:

Но каким образом происходит генерация ссылки? Для этого запустим инструмент, без которого не обходится ни один багхантер, а именно BurpSuite. Перехватываем запросы и смотрим как происходит весь процесс генерации страницы для оплаты:

Мы видим, что присутствует запрос, который генерирует ссылку для создания страницы для переводов по эндпоинту api.cloudtips.ru/api/paymentpages/urls/generate. Но куда эта ссылка попадает дальше? Перехватываем следующий запрос:

И видим, как по эндпоинту api.cloudtips.ru/api/paymentpages в наш запрос вставляется сгенерированная при прошлом запросе ссылка. Отправляем запрос… И видим в ответе от сервера, как создался наш paymentpage!

Эксплуатация

И тут пришла в голову мысль, что произойдет, если при отправке запроса в параметр URL самому подставить что-либо вместо сгенерированного сервером URL. Недолго думая, пробуем подставить ID чужой страницы для переводов!

Иии…вуаля! Страница для выплаты добавилась к нам в профиль, теперь мы являемся ее полноценным обладателем. Но… ссылка на страницу осталась та же самая, то есть искомый владелец страницы не заметит подмены, а деньги, которые переводились жертве, теперь окажутся у злоумышленника.

Страница жертвы
Страница жертвы
После проделанных действий она становится достоянием злоумышленника
После проделанных действий она становится достоянием злоумышленника

Обратите внимание, что ссылка никак не поменялась и QR-код остается тем же. Но на этом не все. Функционал данного сервиса позволяет нам выставляет абсолютно любые параметры paymentpage’а, которые описывались раннее, в том числе никнэйм владельца страница, фото аватара, фон изображении. Для злоумышленника не составит труда подделать страницу идентичную жертвы. Вся работа api у CloudTips описана в их документации https://support.cloudpayments.ru/wiki/spaces/CA/pages/2601811972/API. В конце концов, злоумышленник привязывает к странице свою карту, подделывает ее внешний
вид - профит. Отличить ее от подлинника невозможно и донаты вместе с чаевыми уже приходят не пользователю, а злоумышленнику.

Итоговая оценка бага службой безопасности CloudPayments

Cразу хотелось бы поблагодарить сервис CloudPayments за оперативное ведение диалога , а площадку BI.ZONE BugBounty(https://app.bugbounty.bi.zone) за предоставленную возможность.

Изначально отправляя данную багу выставил критичность уровня "Critical", но пришел ответ от службы безопасности:

С первым пунктом я был не согласен, так как

  1. Используем google dorks,например site:pay.cloudtips.ru/p/*

  2. Используем WaybackMachine

И находим еще 1204 уникальных ссылок
Второй аргумент парировать не получилось. Заранее предвидеть такую особенность было сложновато, не хватило опыта в тестировке.

Итог

Данная статья была опубликована с согласия службы безопасности CloudPayments. Баг был закрыт 3 месяца назад. Спасибо представителям BI.ZONE BugBounty и CloudPayments за быстрые ответы и существенные вознаграждения!

Источник: https://habr.com/ru/articles/766350/


Интересные статьи

Интересные статьи

Всякий раз, получая минус в статью за «не соответствует тематике Хабра», я воспринимаю эту оценку со смесью досады и удовлетворения. В целом считаю, что мне удаётся подбирать темы достаточно интересны...
Когда речь заходит об образовательной робототехнике или микроэлектронике, на ум сразу приходят LEGO, Arduino, Micro:bit, Raspberry Pi, VEX, MakeBot и другие известные международные марки. Да, можно ск...
Отечественный рынок кибербезопасности испытывает как никогда острую потребность в новых квалифицированных кадрах: согласно исследованию Positive Technologies, число кибератак постоянно ...
5. ТестированиеНеоценимую поддержку нам оказал давний партнер в лице ПАО «МТС». Разумеется в процессе разработки мы проводили тестирование на доступных ядрах, например, N...
В 2013 году Коди Уилсон напечатал на 3D-принтере первый пластиковый пистолет, способный стрелять боевыми патронами. Шум вокруг этого события давно улегся, но энтузиас...