• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Как я нашел баг, который раскрывал ваш пароль от PayPal

tabac

CPU register
Пользователь
Регистрация
30.09.2018
Сообщения
1 610
Решения
1
Реакции
3 332
В охоте на проблемы безопасности погоня за неизведанными активами и скрытыми конечными точками часто заканчивается тем, что вы отвлекаетесь от очевидной, но по-прежнему важной функциональности.

Если вы подходите к цели, как будто вы — первый человек, который оценивает безопасность, то я считаю, вы обязательно найдёте что-то новое. Особенно если код, который вы тестируете, всё ещё находится в разработке. Это история о серьёзном баге безопасности, который влияет, наверное, на самую посещаемую страницу PayPal: страницу с формой входа.

Первое открытие​

Исследуя поток аутентификации в PayPal, я обратил внимание на файл javascript, который содержал то, что выглядело идентификатором сессии и токеном CSRF.

1d1b279eaa056c2dd9ebaafffcb1e691.png

Это немедленно привлекло моё внимание, поскольку предоставить данные сессии внутри валидного файла JS обычно означает дать возможность злоумышленникам атаковать.

В атаке, известной как XSSI, вредоносные веб-страница может воспользоваться тегом <script>, чтобы импортировать скрипт из другого источника [имеется в виду CORS], в свою очередь, позволяющий получить доступ к данным внутри атакуемого файла.

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

dcdcc39daa2633cfc530b815001db918.png

Однако важность секрета измеряется ущербом, который вы можете причинить, если знаете его. Поэтому я сразу решил выяснить, что именно означают переменные _csrf и _sessionID и как их можно использовать в реальной атаке.

После бессчётного количества попыток заменить токен CSRF аутентифицированных запросов на платформе pay pal на _csrf я пришёл к выводу, что классическая подделка запросов с этим токенами невозможна. Точно так же, чтобы выдать себя за жертву, не было достаточно идентификатора cессии из скрипта.

Затем я вернулся к уязвимому скрипту, чтобы понять, для чего он используется. Это привело меня в глубины основного механизма защиты PayPal, который применялся, чтобы предотвращать brute force — известную проблему безопасности. Хотя эта функциональность используется во многих местах, я сфокусируюсь на форме входа.

6d246f3a15b9b44ce0be5e932b17046b.png

Идея была довольно проста: после нескольких неудачных попыток залогиниться, прежде чем попробовать снова, вам придётся решить рекапчу. Реализация, однако, может вас весьма удивить.

Когда система обнаруживает вероятный брутфорс, ответом на следующую попытку аутентификации оказывается страница, которая не содержит ничего, кроме капчи Google, и, если пользователь решил её, инициируется POST-запрос на /auth/validatecaptcha.

11efc4a59f8b9b03568d2b5e972cc2bb.png

В теле запроса присутствуют уже знакомые нам переменные _csrf и sessionID, а также другие значения, к которым я вернусь немного позже.

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

ccce3a76055ce23343a26082bbbf9d3e.png

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

В реальной атаке единственное, что требуется от пользователя, — одно посещение страницы, которая контролируется злоумышленниками. Поэтому я сделал шаг назад и попытался выяснить, каких параметров не хватает. Это оказалось проще, чем я ожидал.
  • Значение jse вообще не проходило валидацию.
  • recapcha был токеном, который предоставляется Google во время решения капчи, он не привязан к определённой cессии, так что любой валидный токен, например, сгенерированный автоматическим сервисом, может подойти.

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

Сложив всё это вместе, я создал доказательство концепции, в котором демонстрируется весь процесс, за исключением интеграции сервиса решения капчи.

Вначале эксплуатируется уязвимость XSSI; это делается, чтобы получить множество токенов, которое было бы валидным в сессии жертвы. Затем в браузере жертвы запускается несколько запросов со случайными логином и паролем, которые имитируют попытку брутфорса и запускают поток решения проблемы безопасности.

Как только жертва входит в PayPal с того же браузера, кэшированные случайные креды заменяются электронным адресом и паролем пользователя. Последний шаг — получить токен рекапчи, после чего креды в сыром виде отправляются серверу, к конечной точке /auth/validatecaptcha, чтобы отобразиться на странице.

6135bd1c87bf2db5e98813f417864803.png

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

Раскрытие информации​

Доказательство концепции вместе с соответствующей информацией были отправлены в программу Bug Bounty от PayPal 18 ноября 2019 года и проверены на HackerOne спустя 18 дней. Затем последовало быстрое подтверждение от команды PayPal и несколько дополнительных вопросов. Моё вознаграждение составило $ 15300, я получил его 10 декабря. Да, баг получил оценку 8 баллов (высокий приоритет) по шкале CVSS — эту же оценку поставил я, когда отправлял свой отчёт.

Патч применили спустя ещё 24 часа. Это означает, что ошибку исправили через 5 дней после предупреждения — это довольно впечатляющий срок.

Исправление и рекомендация по профилактике​

Конечная точка /auth/validatecaptch теперь требует дополнительного токена CSRF, который не может быть скомпрометирован при помощи включения межсайтового скриптинга.


Автор оригинала: Alex Birsan
перевод @Doublesharp
 
I enjoy reading a lot of what you post and I follow you so don't take this criticism to heart. I do think you should give recognition to the person who actually found this bug as it's titled and reads as if you yourself found it. This article is just a copy and paste from here:


So you should give a reference to that as well considering you didn't write the article.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Мне нравится читать многое из того, что вы публикуете, и я слежу за вами, так что не принимайте эту критику близко к сердцу. Я действительно думаю, что вы должны признать человека, который действительно нашел эту ошибку, так как она читается так, как будто вы сами ее нашли. Эта статья - просто копия и вставка отсюда:




Поэтому вы также должны дать ссылку на это, учитывая, что вы не писали статью.
 
are you blind?
Yeah I have just seen it now, I have a translation extension that didn't translate so apologies there. Still, it's right at the bottom of the article, not clearly stated and the title has been changed to "how I found a bug..." so I stand by everything else I said prior to the "giving reference".

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Да, я только что это увидел, у меня есть расширение для перевода, которое не переводило, поэтому приношу извинения. Тем не менее, это прямо внизу статьи, четко не указано, и название было изменено на "как я нашел ошибку...", поэтому я придерживаюсь всего остального, что я сказал до "ссылки".
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх