[Перевод] Перевод: Захват аккаунта: Эпическая история баг-баунти
Здравствуйте, друзья! Я вернулся после долгого перерыва с интересной ошибкой 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, и фильтрует только
-->