В этом посте я расскажу, как обнаружил уязвимость, которая позволяет злоумышленнику менять пароли других пользователей, что может привести к захвату аккаунтов. Также я обнаружил, что токен восстановления пароля не аннулируется после использования.

Объект исследования

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)


  1. JWSHunter
    02.07.2025 16:42

    Хороший классический пример IDOR с очень серьёзными последствиями. Казалось бы, "забыли пароль" - обычная фича, а тут целый дырявый люк для взлома аккаунтов. Особенно примечательно, что токен сброса не сгорает после использования - почти как дать ключ от квартиры и забыть его заблокировать

    Отдельно стоит отметить, что даже без официальной программы bb автору удалось эффективно взаимодействовать с командой безопасности - оперативно, прозрачно и с взаимным уважением, как и должно быть


  1. itshnick88
    02.07.2025 16:42

    Проблема рассмотрена и признана критической.

    Выплачена награда 65 USD

    =(((