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

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

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

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

Я снова изменил 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”
}
Я уже собирался сдаться, но в качестве последней попытки я снова отправил запрос, указав только электронную почту, и получил новую ошибку!

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

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

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


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

Затем я попытался сбросить пароль, чтобы проверить, отправил ли он какой-либо OTP.
Но получил новую ошибку - "Пароль не может быть сброшен, так как электронная почта не зарегистрирована или не проверена."

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

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

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

Я такой:

Проблема решена! Пользователь не может сбросить свой пароль через ссылку сброса пароля.
Возможно, до сих пор это было не очень понятно, но я подытожу вкратце:
Две электронные почты:Нападающий - Wrestlingmaster27+2@gmail.comЖертва (незарегистрированный аккаунт) - Cyborj27+9@gmail.com
Приложение не имеет функциональных возможностей для изменения электронной почты.
Из учетной записи атакующего измените адрес электронной почты на адрес жертвы, перечислив значение UserAttributes.
"UserAttributes":[
{"Name": "email",
"Value": "cyborj27+9@gmail.com"
}Когда злоумышленник сменит почту, жертва получит OTP-код для проверки.
Но проверять почту не нужно, злоумышленник уже получил электронную почту жертвы, привязанную к ее аккаунту.
Злоумышленник выходит из системы и пытается войти в систему, используя электронную почту жертвы и пароль злоумышленника. Приложение не позволит этого сделать, так как электронная почта жертвы еще не зарегистрирована.
Злоумышленник переходит к регистрации и регистрируется с помощью электронной почты жертвы. Приложение выдает ошибку - " Ваша учетная запись временно недоступна. Пожалуйста, попробуйте войти в систему через 15 минут".
Через 15 минут злоумышленник возвращается к панели входа и успешно входит в систему, используя электронную почту жертвы и пароль злоумышленника.
Когда жертва пытается сбросить пароль или проверить учетную запись, приложение выдает ошибку - "Неверное имя пользователя", что означает, что жертва потеряла все способы восстановить свою учетную запись.
Из-за сильной неправильной конфигурации (Broken Access Control) у злоумышленника есть учетная запись, связанная с электронной почтой жертвы. Атакующий только зарегистрировал электронную почту и не верифицировал ее, поэтому на внутреннем сервере нет записи об электронной почте жертвы. (Это только мое предположение, я не уверен).
Я заблокировал все способы восстановления аккаунта для жертвы:
Жертва не может сбросить свой пароль с помощью "функции сброса пароля".
Если жертва попытается связаться со службой поддержки для сброса пароля, скорее всего, служба поддержки не сможет найти электронную почту жертвы в бэкенде, так как это непроверенная электронная почта - (мое предположение основано на ошибке, которую я получил во время сброса пароля и повторной отправки верификации).
Но все же оставалось одно условие "Если", что если жертве удастся восстановить свой аккаунт?
Я обнаружил HTML-инъекцию в поле имени, когда начал охотиться на приложение. Я проигнорировал ее, потому что она не оказывала никакого влияния.
Затем у меня возникла идея, если каким-то образом преобразовать это в хранимый XSS и поместить полезную нагрузку в аккаунт жертвы, то всякий раз, когда жертве удастся восстановить свой аккаунт, сработает XSS.
Я поместил основную XSS полезную нагрузку в поле фамилии, но приложение показало пустое белое пространство и никакого предупреждения.


После нескольких часов попыток я выяснил, что приложение имеет только базовую защиту от XSS, и фильтрует только <script>, <img>, alert и т.д.
Затем я создал полезную нагрузку, заменил alert на prompt, и все заработало!
<a onmouseover=”prompt(document.cookie)”>Here</a>

Как только жертва прокрутит страницу с фамилией, сработает XSS.



Я заблокировал все способы получения пароля жертвой, и даже если им удастся это сделать (что практически невозможно), то в разделе профиля их ждет XSS.
Влияние на бизнес:
Приложение имеет критическую уязвимость, которая позволяет злоумышленникам обойти механизмы аутентификации и создать учетную запись без проверки OTP.
Уязвимость также позволяет злоумышленнику злоупотреблять функциональными возможностями приложения, например, изменять адрес электронной почты в разделе профиля, что намеренно не разрешено приложением.
Как злоумышленник, я могу установить имя жертвы в качестве хранимой XSS полезной нагрузки, поскольку приложение уязвимо к хранимому XSS. Когда жертва сбросит свой пароль (что практически невозможно), она войдет в свой аккаунт. Как только жертва войдет в систему, сработает XSS полезная нагрузка, что приведет к раскрытию cookies.
Обход механизмов аутентификации этого приложения позволяет злоумышленнику (предварительно) завладеть учетной записью жертвы. Как злоумышленник, я могу использовать любой адрес электронной почты жертвы для регистрации/привязки аккаунта и выполнения действий от имени жертвы.
"Если вы дошли до этого момента, я хочу сказать вам спасибо за то, что прочитали эту длинную историю!"
Давайте общаться: Twitter и Linkedin.
Оригинал статьи - здесь.
Поддержите автора хлопками на Medium.
Перевод статьи был выполнен проектом перевод энтузиаста:
? @Ent_TranslateIB - Телеграмм канал с тематикой информационной безопасности
? @Ent_Translate - Инстаграм проекта