From 3c23adde46ac5c1e5053fe2ffba4464818db7867 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Wed, 14 Jun 2023 11:47:01 -0600 Subject: [PATCH 1/4] fix for email sanitzation during forgot password process --- CHANGELOG.md | 6 ++++++ classes/Controller.php | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bc6ad4..8ab1a60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# v3.7.5 +## mm/dd/2023 + +1. [](#bugfix) + * Sanitized `email` during the "forgot password" process to protect against XSS attacks + # v3.7.4 ## 05/09/2023 diff --git a/classes/Controller.php b/classes/Controller.php index e5cffda..bd262d8 100644 --- a/classes/Controller.php +++ b/classes/Controller.php @@ -351,6 +351,10 @@ protected function taskForgot() $users = $this->grav['accounts']; $email = $data['email'] ?? ''; + + // Sanitize $email + $email = htmlspecialchars(strip_tags($email), ENT_QUOTES, 'UTF-8'); + $user = !empty($email) ? $users->find($email, ['email']) : null; /** @var Language $language */ From da50a5591b9d5c0d512174f852030c36011b94df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vilius=20=C5=A0umskas?= Date: Wed, 14 Jun 2023 22:44:08 +0300 Subject: [PATCH 2/4] Fix account enumeration vulnerability on the forgot password page (#297) --- classes/Controller.php | 23 ----------------------- languages/de.yaml | 3 --- languages/en.yaml | 5 +---- languages/es.yaml | 4 +--- languages/fr.yaml | 2 -- languages/lt.yaml | 7 ++----- languages/no.yaml | 2 -- languages/pt-BR.yaml | 3 --- languages/ru.yaml | 5 +---- languages/uk.yaml | 5 +---- languages/zh.yaml | 3 --- 11 files changed, 6 insertions(+), 56 deletions(-) diff --git a/classes/Controller.php b/classes/Controller.php index bd262d8..9421cdd 100644 --- a/classes/Controller.php +++ b/classes/Controller.php @@ -368,29 +368,6 @@ protected function taskForgot() return true; } - if (!$user || !$user->exists()) { - $messages->add($language->translate(['PLUGIN_LOGIN.FORGOT_USERNAME_DOES_NOT_EXIST', $email]), 'error'); - $this->setRedirect($this->login->getRoute('forgot') ?? '/'); - - return true; - } - - if (empty($user->email)) { - $messages->add($language->translate(['PLUGIN_LOGIN.FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL', $email]), - 'error'); - $this->setRedirect($this->login->getRoute('forgot') ?? '/'); - - return true; - } - - if (empty($user->password) && empty($user->hashed_password)) { - $messages->add($language->translate(['PLUGIN_LOGIN.FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD', $email]), - 'error'); - $this->setRedirect($this->login->getRoute('forgot') ?? '/'); - - return true; - } - $from = $config->get('plugins.email.from'); if (empty($from)) { diff --git a/languages/de.yaml b/languages/de.yaml index 1af8a8b..c353d84 100644 --- a/languages/de.yaml +++ b/languages/de.yaml @@ -21,9 +21,6 @@ PLUGIN_LOGIN: RESET_INVALID_LINK: "Es wurde ein ungültiger Link zum Zurücksetzen verwendet. Bitte erneut versuchen." FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Die Anweisungen zum Zurücksetzen Ihres Passworts wurden per E-Mail gesendet." FORGOT_FAILED_TO_EMAIL: "Das Versenden der Anweisung per E-Mail ist fehlgeschlagen. Bitte später erneut versuchen." - FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Das Passwort für %s kann nicht zurückgesetzt werden. Es ist keine E-Mail-Adresse hinterlegt." - FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD: "Das Passwort für %s kann nicht zurückgesetzt werden. Diese E-Mail ist mit einem Remote-Account verknüpft." - FORGOT_USERNAME_DOES_NOT_EXIST: "Der Benutzer mit dem Benutzername %s existiert nicht." FORGOT_EMAIL_NOT_CONFIGURED: "Das Passwort kann nicht zurückgesetzt werden, da die Website ist nicht zum Versenden von E-Mails konfiguriert." FORGOT_EMAIL_SUBJECT: "Passwort zurückzusetzen für %s" FORGOT_EMAIL_BODY: "

Passwort Zurücksetzen

Hallo %1$s,

Es wurde ein Anfrage auf %4$s gestellt, um Ihr Passwort zu ändern.


Klicken Sie hier, um Ihr Passwort zurückzusetzen

Alternativ kopieren Sie die folgende URL in die Adresszeile Ihres Browsers:

%2$s


Mit freundlichen Grüßen,

%3$s

" diff --git a/languages/en.yaml b/languages/en.yaml index 895ba26..c3eb1f1 100644 --- a/languages/en.yaml +++ b/languages/en.yaml @@ -18,11 +18,8 @@ PLUGIN_LOGIN: RESET_LINK_EXPIRED: "Reset link has expired, please try again" RESET_PASSWORD_RESET: "Password has been reset" RESET_INVALID_LINK: "Invalid reset link used, please try again" - FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Instructions to reset your password have been sent via email" + FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "If an account exists, instructions on resetting your password have been sent via email" FORGOT_FAILED_TO_EMAIL: "Failed to email instructions, please try again later" - FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Cannot reset password for %s, no email address is set" - FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD: "Cannot reset password for %s, this email is associated with a remote account" - FORGOT_USERNAME_DOES_NOT_EXIST: "User with username %s does not exist" FORGOT_EMAIL_NOT_CONFIGURED: "Cannot reset password. This site is not configured to send emails" FORGOT_EMAIL_SUBJECT: "%s Password Reset Request" FORGOT_EMAIL_BODY: "

Password Reset

Dear %1$s,

A request was made on %4$s to reset your password.


Click this to reset your password

Alternatively, copy the following URL into your browser's address bar:

%2$s


Kind regards,

%3$s

" diff --git a/languages/es.yaml b/languages/es.yaml index eb9a27d..ed4aa95 100644 --- a/languages/es.yaml +++ b/languages/es.yaml @@ -19,10 +19,8 @@ PLUGIN_LOGIN: RESET_LINK_EXPIRED: "El enlace para la restauración ha caducado, inténtelo de nuevo." RESET_PASSWORD_RESET: "La contraseña ha sido restaurada" RESET_INVALID_LINK: "Ha utilizado un enlace de restauración inválido, inténtelo de nuevo." - FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Instructions to reset your password have been sent via email" + FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "If an account exists, instructions on resetting your password have been sent via email" FORGOT_FAILED_TO_EMAIL: "No se ha podido enviar el email con instrucciones, inténtelo de nuevo." - FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "No se puede restaurar la contraseña para %s, no hay dirección de email." - FORGOT_USERNAME_DOES_NOT_EXIST: "No existe ningún usuario con el nombre %s." FORGOT_EMAIL_NOT_CONFIGURED: "No se puede restaurar la contraseña. Este sitio no está configurado para enviar emails." FORGOT_EMAIL_SUBJECT: "%s solicitud de restauración de contraseña" FORGOT_EMAIL_BODY: "

Restauración de contraseña

Estimado/a %1$s,

Se ha realizado una petición de restauración de contraseña en %4$s.


Pulse aquí para restaurar su contraseña

Como alternativa puede copiar la siguiente URL en la barra de direcciones de su navegador:

%2$s


Saludos cordiales,

%3$s

" diff --git a/languages/fr.yaml b/languages/fr.yaml index f98c5ac..8ee745f 100644 --- a/languages/fr.yaml +++ b/languages/fr.yaml @@ -19,8 +19,6 @@ PLUGIN_LOGIN: RESET_INVALID_LINK: "Le lien de réinitialisation utilisé n’est pas valide, veuillez réessayer" FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Les instructions pour la réinitialisation de votre mot de passe ont été envoyées par e-mail" FORGOT_FAILED_TO_EMAIL: "Impossible d’envoyer les instructions, veuillez réessayer ultérieurement" - FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Impossible de réinitialiser le mot de passe pour %s, aucune adresse e-mail n’a été paramétrée" - FORGOT_USERNAME_DOES_NOT_EXIST: "L’utilisateur avec le nom d’utilisateur %s n’existe pas" FORGOT_EMAIL_NOT_CONFIGURED: "Impossible de réinitialiser le mot de passe. Ce site n’est pas configuré pour envoyer des e-mails" FORGOT_EMAIL_SUBJECT: "Demande de réinitialisation de mot de passe %s" FORGOT_EMAIL_BODY: "

Réinitialisation de mot de passe

%1$s,

Une demande a été faite sur %4$s pour la réinitialisation de votre mot de passe.


Cliquez ici pour réinitialiser votre mot de passe

Vous pouvez également copier l’URL suivante dans la barre d’adresse de votre navigateur :

%2$s


Cordialement,

%3$s

" diff --git a/languages/lt.yaml b/languages/lt.yaml index 12be54a..b29415e 100644 --- a/languages/lt.yaml +++ b/languages/lt.yaml @@ -18,12 +18,9 @@ PLUGIN_LOGIN: RESET_LINK_EXPIRED: "Atstatymo nuoroda nebegalioja, bandykite dar kartą" RESET_PASSWORD_RESET: "Slaptažodis atstatytas" RESET_INVALID_LINK: "Panaudota neteisinga atstatymo nuoroda, bandykite dar kartą" - FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Slaptažodžio atstatymo instrukcijos buvo išsiųstos el. paštu" + FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Jeigu vartotojo paskyra egzistuoja, slaptažodžio atstatymo instrukcijos buvo išsiųstos el. paštu" FORGOT_FAILED_TO_EMAIL: "Instrukcijų išsiuntimas nepavyko, bandykite dar kartą" - FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Negalima atstatyti %s slaptažodžio, nenurodytas el. paštas" - FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD: "Negalima atstatyti %s slaptažodžio, šis el. paštas susietas su nuotoline paskyra" - FORGOT_USERNAME_DOES_NOT_EXIST: "Vartotojas vardu %s neegzistuoja" - FORGOT_EMAIL_NOT_CONFIGURED: "Negalima tastatyti slaptažodžio. Ši svetainė nenustatyta siųsti el. laiškus" + FORGOT_EMAIL_NOT_CONFIGURED: "Negalima atstatyti slaptažodžio. Ši svetainė nenustatyta siųsti el. laiškus" FORGOT_EMAIL_SUBJECT: "%s slaptažodžio atstatymo užklausa" FORGOT_EMAIL_BODY: "

Slaptažodis atstatytas

Miela(s) %1$s,

%4$s buvo gauta užklausa jūsų slaptažodžio atstatymui.


Paspauskite čia norėdami atstatyti slaptažodį

Taip pat galite nukopijuoti sekančią nuorodą į savo naršyklės adreso juostą:

%2$s


Linkėjimai,

%3$s

" SESSION: "“Prisiminti mane”-sesija" diff --git a/languages/no.yaml b/languages/no.yaml index a8ca03a..098a361 100644 --- a/languages/no.yaml +++ b/languages/no.yaml @@ -21,8 +21,6 @@ PLUGIN_LOGIN: RESET_INVALID_LINK: "Ugyldig ilbakestillingslenke, vennligst prøv igjen" FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Instruksjoner for å tilbakestille passordet ditt er sendt via e-post" FORGOT_FAILED_TO_EMAIL: "Kunne ikke sende instruksjoner, prøv igjen senere" - FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Kan ikke tilbakestille passord for %s, ingen e-postadresse er angitt" - FORGOT_USERNAME_DOES_NOT_EXIST: "Bruker med brukernavn %s eksisterer ikke" FORGOT_EMAIL_NOT_CONFIGURED: "Kan ikke tilbakestille passord. Dette nettstedet er ikke konfigurert til å sende e-post" FORGOT_EMAIL_SUBJECT: "Forespørsel om tilbakestilling av passord for %s" FORGOT_EMAIL_BODY: "

Tilbekestilling av passord

%1$s,

En forespørsel om tilbakestilling av passord ble gjort på %4$s.


Klikk her for å tilbakestille passordet ditt

Du kan også kopiere følgende nettadresse til nettleserens adressefelt:

%2$s


Vennlig hilsen,

%3$s

" diff --git a/languages/pt-BR.yaml b/languages/pt-BR.yaml index c5ee63b..2aca491 100644 --- a/languages/pt-BR.yaml +++ b/languages/pt-BR.yaml @@ -17,9 +17,6 @@ PLUGIN_LOGIN: RESET_INVALID_LINK: "Link de recuperação de senha inválido, tente novamente!" FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "As instruções para recuperar sua senha foram enviadas para seu e-mail!" FORGOT_FAILED_TO_EMAIL: "Falha ao tentar recuperar a senha, tente novamente mais tarde!" - FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Não é possível recuperar a senha para %s, nenhum e-mail inserido!" - FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD: "Não é possível recuperar a senha para %s, este e-mail já está em uso!" - FORGOT_USERNAME_DOES_NOT_EXIST: "O usuário %s não existe!" FORGOT_EMAIL_NOT_CONFIGURED: "Não é possível recuperar a senha. Este site não está configurado para enviar e-mails!" FORGOT_EMAIL_SUBJECT: "%s requer recuperação da senha" FORGOT_EMAIL_BODY: "

Recuperação da Senha

Olá %1$s,

Foi feito um pedido no %4$s para recuperar sua senha.


Clique aqui para recuperar sua senha

Como alternativa, copie a seguinte URL na barra de endereços do navegador:

%2$s


Atenciosamente,

%3$s

" diff --git a/languages/ru.yaml b/languages/ru.yaml index 3ee8b61..528674c 100644 --- a/languages/ru.yaml +++ b/languages/ru.yaml @@ -19,11 +19,8 @@ PLUGIN_LOGIN: RESET_LINK_EXPIRED: "Время ссылки для сброса истекло, повторите попытку" RESET_PASSWORD_RESET: "Пароль был сброшен" RESET_INVALID_LINK: "Неверная ссылка сброса, повторите попытку" - FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Инструкции по сбросу пароля были отправлены по электронной почте" + FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Eсли имя пользователя существует, инструкции по сбросу пароля были отправлены по электронной почте" FORGOT_FAILED_TO_EMAIL: "Не удалось отправить инструкции по электронной почте, повторите попытку позже" - FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Не удается сбросить пароль для %s, адресс электронной почты не установлен" - FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD: "Невозможно сбросить пароль для %s, этот email связан с удаленной учетной записью" - FORGOT_USERNAME_DOES_NOT_EXIST: "Пользователь с именем %s не существует" FORGOT_EMAIL_NOT_CONFIGURED: "Невозможно сбросить пароль. Этот сайт не настроен для отправки писем" FORGOT_EMAIL_SUBJECT: "%s Запрос на сброс пароля" FORGOT_EMAIL_BODY: "

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

Уважаемый %1$s,

Был сделан запрос для сброса пароля от %4$s.


Нажмите, чтобы сбросить пароль

Или скопируйте следующий URL-адрес в адресную строку браузера:

%2$s


С уважением,

%3$s

" diff --git a/languages/uk.yaml b/languages/uk.yaml index e0a0393..66be594 100644 --- a/languages/uk.yaml +++ b/languages/uk.yaml @@ -19,11 +19,8 @@ PLUGIN_LOGIN: RESET_LINK_EXPIRED: "Час посилання для скидання минув, спробуйте ще раз" RESET_PASSWORD_RESET: "Пароль був скинутий" RESET_INVALID_LINK: "Невірне посилання скидання, спробуйте ще раз" - FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Інструкції щодо скидання пароля були надіслані по електронній пошті" + FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Якщо ім'я користувача існує, iнструкції щодо скидання пароля були надіслані по електронній пошті" FORGOT_FAILED_TO_EMAIL: "Не вдалося надіслати інструкції електронною поштою, повторіть спробу пізніше" - FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Не вдається скинути пароль для %s, адреса електронної пошти не встановлена" - FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD: "Неможливо скинути пароль для %s, цей email пов'язаний з віддаленим обліковим записом" - FORGOT_USERNAME_DOES_NOT_EXIST: "Користувач з ім'ям %s не існує" FORGOT_EMAIL_NOT_CONFIGURED: "Неможливо скинути пароль. Цей сайт не налаштований для надіслання листів" FORGOT_EMAIL_SUBJECT: "%s Запит на скидання пароля" FORGOT_EMAIL_BODY: "

Відновлення паролю

Шановний %1$s,

Був зроблений запит для скидання пароля від %4$s.


Нажмите, чтобы сбросить пароль

Или скопируйте следующий URL-адрес в адресную строку браузера:

%2$s


С уважением,

%3$s

" diff --git a/languages/zh.yaml b/languages/zh.yaml index bfca18f..e8f2691 100644 --- a/languages/zh.yaml +++ b/languages/zh.yaml @@ -17,9 +17,6 @@ PLUGIN_LOGIN: RESET_INVALID_LINK: "重置链接已经使用,请重试" FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "重置密码指引已经发送到您的邮箱。" FORGOT_FAILED_TO_EMAIL: "发送指引邮件失败,请稍后重试。" - FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "因尚未设置邮箱,无法为 %s 重置密码" - FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD: "因邮箱关联到一个外部帐号,无法为 %s 重置密码。" - FORGOT_USERNAME_DOES_NOT_EXIST: "用户 %s 不存在。" FORGOT_EMAIL_NOT_CONFIGURED: "无法重置密码,本站点尚未配置邮件系统。" FORGOT_EMAIL_SUBJECT: "%s 的密码重置请求" FORGOT_EMAIL_BODY: "

密码充值

尊敬的 %1$s,

我们收到一个重置您的 %4$s 密码的请求。


点击这里进行重置密码

另外,您也可以复制下面的链接到浏览器地址栏中访问:

%2$s


此致

%3$s

" From 40235bd5b89eca64ae77204f21cc2b21e0993f74 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Wed, 14 Jun 2023 13:45:33 -0600 Subject: [PATCH 3/4] updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ab1a60..8af5a33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ 1. [](#bugfix) * Sanitized `email` during the "forgot password" process to protect against XSS attacks + * Fixed an account enumeration vulneratiblity in forgot password [#293](https://github.com/getgrav/grav-plugin-login/pull/293) # v3.7.4 ## 05/09/2023 From 629b9bb3111b7dfc1c8f325540e7fd86f16e47fe Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Wed, 14 Jun 2023 14:10:45 -0600 Subject: [PATCH 4/4] prepare for release --- CHANGELOG.md | 2 +- blueprints.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8af5a33..bd230d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ # v3.7.5 -## mm/dd/2023 +## 06/14/2023 1. [](#bugfix) * Sanitized `email` during the "forgot password" process to protect against XSS attacks diff --git a/blueprints.yaml b/blueprints.yaml index e6b1b20..bd7b61b 100644 --- a/blueprints.yaml +++ b/blueprints.yaml @@ -1,7 +1,7 @@ name: Login slug: login type: plugin -version: 3.7.4 +version: 3.7.5 testing: false description: Enables user authentication and login screen. icon: sign-in