[Перевод] Перевод: Захват аккаунта: Эпическая история баг-баунти

Здравствуйте, друзья! Я вернулся после долгого перерыва с интересной ошибкой Account Takeover и тем, как я связал ее с XSS. Вы можете запутаться, поскольку это длинная статья, но не волнуйтесь, дочитайте до конца; в конце я все упростил для лучшего понимания.

87481250a31bc032cda5d3a06e3adfba.png

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

Я охотился в рамках старой частной программы по поиску ошибок. Я знал, что мне нужно найти уникальную проблему, чтобы избежать дублирования. Как обычно, я запустил свой burp и начал наугад просматривать цель.

Я наткнулся на раздел профиля на сайте. Там была возможность редактировать только имена и пароли, но не электронную почту.

Нет возможности изменить электронную почту

Нет возможности изменить электронную почту

Я решил изменить адрес электронной почты. Для этого я начал изучать другие настройки, изменил имя и перехватил запрос в Burp.

e758f2246132284cda8afcc0dc6014d5.png

Я заметил и начал играть с UserAttributes. Сначала я изменил name на update_email и value на почту существующего аккаунта.Я получил ошибку -
{
»__type»: «InvalidParameterException»,
«message»: «user.update_email: Attribute does not exist in the schema.\n»
}

aa2fdca353fd357c455b715f8dad7df6.png

Я снова изменил name на change_email и отправил запрос, но получил ту же ошибку -…
{
»__type»: «InvalidParameterException»,
«message»: «user.change_email: Attribute does not exist in the schema.\n»
}

Затем я вернулся к запросу процесса регистрации и заметил, что приложение отправляет новый адрес электронной почты в атрибуте Username при регистрации. Я изменил name на Username, но снова получил ту же ошибку.

{
»__type»: «InvalidParameterException»,
«message»: «user.Username: Attribute does not exist in the schema.\n»
}

Я уже собирался сдаться, но в качестве последней попытки я снова отправил запрос, указав только электронную почту, и получил новую ошибку!

12d47ae47b3d28d323743225b5a2639a.png

Я переключил свое внимание на Pre — Account Takeover (Предварительный захват учетной записи), поскольку эта ошибка подтвердила, что я не могу захватить учетную запись другого пользователя. Я изменил адрес электронной почты на незарегистрированный, и все заработало.

b5f9f84be289d41f61535ca775b943f5.png

Я получил OTP верификацию на новый адрес электронной почты. Однако я смог успешно изменить адрес электронной почты на новый без прохождения процесса верификации и получил аккаунт без какой-либо проверки.

331e17c738e6b9d482531682ff29b45a.png

Ух ты! Я слишком разволновался, составил отчет и отправил его :)

В течение нескольких часов они изменили его на «Неприменимо» и прислали мне этот ответ:

e9b6e1ad4e50fab697ccd4687467ffed.png9a9bc14212d34be1bd10c7dabae2c3e4.png

Получив этот ответ, я вернулся в приложение и попытался войти в систему, используя почту жертвы (Cyborj27+9@gmail.com) и пароль злоумышленника, и получил ошибку — «имя пользователя или пароль неверны».

6b2f2d9a017f201354945ed04ec9ae20.png

Затем я попытался сбросить пароль, чтобы проверить, отправил ли он какой-либо OTP.

Но получил новую ошибку — «Пароль не может быть сброшен, так как электронная почта не зарегистрирована или не проверена.»

bb6a80c7e3a4a6f987a919db88ee8eea.png

Я записал все полученные ошибки и лег спать. На следующий день я снова начал с самого начала, но не нашел ничего нового. Снова открыл свои записи и прочитал их 2–3 раза. Прочитав эту ошибку — «Пароль не может быть сброшен, так как электронная почта не зарегистрирована или не проверена.»

Я решил попробовать зарегистрироваться с помощью электронной почты жертвы. Когда я зарегистрировался, приложение выкинуло новую ошибку — «Ваш аккаунт временно недоступен. Пожалуйста, попробуйте войти в систему через 15 минут».

9764460496deed2af29ca355f1f1b586.png

Через 15 минут я попытался войти в систему с помощью электронной почты жертвы и пароля, использованного при регистрации. Но я все еще получал эту ошибку — «имя пользователя или пароль неверны».

Тогда я попытался войти в систему с помощью электронной почты жертвы (cyborj27+9@gmail.com) и пароля злоумышленника (wrestlingmaster27+2@gmail.com). И к моему удивлению, я получил доступ к аккаунту!

Теперь главная проблема заключалась в следующем.

«Пароль может быть сброшен владельцем адреса электронной почты в любое время».

Поэтому я вернулся к функции сброса пароля, попытался сбросить пароль и получил ошибку — «Пароль не может быть сброшен, так как электронная почта не зарегистрирована или не проверена.»

83f9c5a900b47dfbce331ac8ad49288a.png

Затем я попытался получить новый проверочный код на электронную почту жертвы и получил ошибку — » Неверное имя пользователя».

72017c7190a3d20eeae7d4acfcd1b6b3.png

Я такой:

3b56568c6b5d06081a2facd003087ea0.png

Проблема решена! Пользователь не может сбросить свой пароль через ссылку сброса пароля.

Возможно, до сих пор это было не очень понятно, но я подытожу вкратце:

  1. Две электронные почты: Нападающий — Wrestlingmaster27+2@gmail.comЖертва (незарегистрированный аккаунт) — Cyborj27+9@gmail.com

  2. Приложение не имеет функциональных возможностей для изменения электронной почты.

  3. Из учетной записи атакующего измените адрес электронной почты на адрес жертвы, перечислив значение UserAttributes.
    «UserAttributes»:[
    {«Name»: «email»,
    «Value»: «cyborj27+9@gmail.com»
    }

  4. Когда злоумышленник сменит почту, жертва получит OTP-код для проверки.

  5. Но проверять почту не нужно, злоумышленник уже получил электронную почту жертвы, привязанную к ее аккаунту.

  6. Злоумышленник выходит из системы и пытается войти в систему, используя электронную почту жертвы и пароль злоумышленника. Приложение не позволит этого сделать, так как электронная почта жертвы еще не зарегистрирована.

  7. Злоумышленник переходит к регистрации и регистрируется с помощью электронной почты жертвы. Приложение выдает ошибку — » Ваша учетная запись временно недоступна. Пожалуйста, попробуйте войти в систему через 15 минут».

  8. Через 15 минут злоумышленник возвращается к панели входа и успешно входит в систему, используя электронную почту жертвы и пароль злоумышленника.

  9. Когда жертва пытается сбросить пароль или проверить учетную запись, приложение выдает ошибку — «Неверное имя пользователя», что означает, что жертва потеряла все способы восстановить свою учетную запись.

  10. Из-за сильной неправильной конфигурации (Broken Access Control) у злоумышленника есть учетная запись, связанная с электронной почтой жертвы. Атакующий только зарегистрировал электронную почту и не верифицировал ее, поэтому на внутреннем сервере нет записи об электронной почте жертвы. (Это только мое предположение, я не уверен).

Я заблокировал все способы восстановления аккаунта для жертвы:

  1. Жертва не может сбросить свой пароль с помощью «функции сброса пароля».

  2. Если жертва попытается связаться со службой поддержки для сброса пароля, скорее всего, служба поддержки не сможет найти электронную почту жертвы в бэкенде, так как это непроверенная электронная почта — (мое предположение основано на ошибке, которую я получил во время сброса пароля и повторной отправки верификации).

Но все же оставалось одно условие «Если», что если жертве удастся восстановить свой аккаунт?

Я обнаружил HTML-инъекцию в поле имени, когда начал охотиться на приложение. Я проигнорировал ее, потому что она не оказывала никакого влияния.

Затем у меня возникла идея, если каким-то образом преобразовать это в хранимый XSS и поместить полезную нагрузку в аккаунт жертвы, то всякий раз, когда жертве удастся восстановить свой аккаунт, сработает XSS.

Я поместил основную XSS полезную нагрузку в поле фамилии, но приложение показало пустое белое пространство и никакого предупреждения.

7bf768cb99857bc309386315b8b20f86.pngf848bd5781d2fb4eddb5991981b81899.png

После нескольких часов попыток я выяснил, что приложение имеет только базовую защиту от XSS, и фильтрует только