Отравление сброса пароля

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

password-reset-poisoning.svg

Как работает сброс пароля?

Практически все сайты, требующие входа, реализуют функциональность, позволяющую пользователям сбросить пароль, если они его забыли. Способов несколько, с разной степенью безопасности и практичности. Один из самых распространённых выглядит так:

  1. Пользователь вводит имя пользователя или адрес электронной почты и отправляет запрос на сброс пароля.

  2. Сайт проверяет существование пользователя и генерирует временный, уникальный, высокоэнтропийный токен, который на бэкенде связывает с аккаунтом пользователя.

  3. Сайт отправляет пользователю электронное письмо со ссылкой для сброса пароля. Уникальный токен пользователя включён в URL соответствующего запроса в виде параметра запроса: https://normal-website.com/reset?token=0a1b2c3d4e5f6g7h8i9j

  4. Когда пользователь переходит по этому URL, сайт проверяет корректность переданного токена и использует его для определения аккаунта, для которого выполняется сброс. Если всё как ожидалось, пользователю предоставляется возможность задать новый пароль. Наконец, токен уничтожается.

Этот процесс достаточно прост и относительно безопасен по сравнению с другими подходами. Однако его безопасность основывается на том, что только целевой пользователь имеет доступ к своему почтовому ящику, а значит — к своему уникальному токену. Отравление сброса пароля — это способ кражи этого токена, чтобы изменить пароль другого пользователя.

Как построить атаку отравления сброса пароля

Если URL, отправляемый пользователю, динамически формируется на основе контролируемого ввода, например заголовка Host, можно построить атаку отравления сброса пароля следующим образом:

  1. Злоумышленник получает адрес электронной почты или имя пользователя жертвы (если требуется) и отправляет запрос на сброс пароля от её имени. При отправке формы он перехватывает HTTP-запрос и меняет заголовок Host так, чтобы он указывал на домен под его контролем. В нашем примере это evil-user.net.

  2. Жертва получает от сайта настоящее письмо для сброса пароля. Оно выглядит как обычная ссылка для сброса и, что важно, содержит валидный токен сброса, связанный с её аккаунтом. Однако доменное имя в URL указывает на сервер злоумышленника: https://evil-user.net/reset?token=0a1b2c3d4e5f6g7h8i9j

  3. Если жертва перейдёт по этой ссылке (или она будет извлечена иным образом, например антивирусным сканером), токен сброса будет доставлен на сервер злоумышленника.

  4. Теперь злоумышленник может зайти на настоящий URL уязвимого сайта и передать украденный токен жертвы через соответствующий параметр. После этого он сможет задать любой пароль и затем войти в её аккаунт.

В реальной атаке злоумышленник может повысить вероятность клика по ссылке, предварительно «подогрев» жертву, например, ложным уведомлением о компрометации. Даже если вы не можете контролировать ссылку для сброса пароля, иногда можно использовать заголовок Host для внедрения HTML в чувствительные письма. Учтите, что почтовые клиенты обычно не выполняют JavaScript, но другие приёмы HTML-инъекций, такие как Инъекция «висящей разметки» (dangling markup), всё ещё применимы.

Last updated