Содержание статьи
- Первый Account Takeover
- Пример пейлоада JWT
- Эксплуатация
- Рекомендации
- Второй Account Takeover
- Эксплуатация
- Рекомендации
В конце 2023 года я участвовал в программе багбаунти одной крупной российской компании. Комбинируя логические ошибки, я смог проэксплуатировать баг, который позволяет захватить любой аккаунт. В этой статье я расскажу, как проходило исследование и какие трюки мне помогли добиться результата.
К сожалению, я не получил согласие на разглашение от компании, однако уязвимость уже устранена. Так что опишу ход тестирования, не называя заказчика.
Этот текст получил премию Pentest Award 2024 в категории Hack the logic, посвященной поиску логических уязвимостей. Это соревнование ежегодно проводится компанией Awillix.
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Первый Account Takeover
При изучении сервиса я нашел несколько интересных аномалий:
- При смене email в настройках профиля доступ к новому адресу не проверяется.
- При регистрации пользователя и логине в его аккаунт API приводит переданный email к нижнему регистру. Но при смене email в настройках профиля он не подвергается никаким изменениям и успешно проходит проверку уникальности, даже если существует близнец с символами в ином регистре.
- При исследовании JWT, который используется для авторизации пользователя, я выяснил, что роль идентификатора пользователя играет email (так как это единственный идентификатор пользователя в пейлоаде JWT).
Получается, что если у почтового адреса есть близнец, то владелец такой почты потенциально сможет подделать токен другого пользователя и получить сессию от его имени.
Пример пейлоада JWT
При попытке войти с данными первого пользователя (того, который был зарегистрирован раньше) мы успешно попадаем в его аккаунт. Если же использовать данные второго пользователя, получаем ошибку Invalid Credentials.