Привет, Хабр! В данной статье хотел бы поделиться историей, как был найден достаточно простой в исполнении баг, но приводящий к опасной уязвимости веб приложения. Данный баг был найден в сервисе 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 за быстрые ответы и существенные вознаграждения!

Комментарии (5)


  1. pyrk2142
    09.10.2023 19:14
    +3

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

    1. Кажется, что достаточно легко найти/купить старый аккаунт, слышал даже про специальные сервисы/людей, которые регистрируют аккаунты пачками на новых сервисах, чтобы потом перепродать их с хорошими именами или бонусами для старых клиентов.

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

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


    1. ap_security Автор
      09.10.2023 19:14
      +2

      Особенности российского BB))


      1. pyrk2142
        09.10.2023 19:14
        +2

        В целом, о российском BB у меня очень теплые воспоминания и отзывы. Самый кринж выдавали как раз крайне знаменитые и богатые иностранные компании, два ярких случая:

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

        А во втором на довольно копеечную уязвимость была реакция вида: "На проде тестировать по правилам программы нельзя, вознаграждение за отчет с прода не дадим. Для тестирования есть специальный открытый тест. А на тесте нет угрозы от использования уязвимости, так как это тест, и он не используется в бизнес-процессе"


        1. visse
          09.10.2023 19:14
          +1

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

          Бессмертная классика.


    1. visse
      09.10.2023 19:14

      Про уменьшение скоупа странный аргумент

      Более чем. Там всего восемь символов в уникальном ID, так что можно было бы и сбрутить какую-то часть без проблем.