Un usuario de Wordpress puede ir a esta URL y solicitar un enlace para restablecer la contraseña por correo electrónico:
https://yourwordpress.example/wp-login.php?action=lostpassword
El enlace de reinicio se verá similar a esto:
https://yourwordpress.example/wp-login.php?action=rp&key=dDnnToiqjYtsa9KdfVZl&login=admin
El parámetro key
en la URL garantiza que solo el destinatario del correo electrónico pueda restablecer la contraseña. Después de visitar el enlace de restablecimiento, se le presentará un formulario para ingresar la nueva contraseña.
Antes de Wordpress 4.0.1, este formulario no proporcionaba un token anti-CSRF. En su lugar, el parámetro key
GET se guarda en una cookie y, después de enviar la nueva contraseña, se verifica el valor de la cookie.
Esto significa que un usuario es vulnerable en el tiempo entre hacer clic en el enlace para restablecer la contraseña e ingresar la nueva contraseña. En ese período de tiempo, y solo entonces , un atacante podría lanzar un ataque CSRF para cambiar la contraseña a un valor arbitrario. (Pero debido a esta pequeña ventana de oportunidad, el error tiene un valor limitado en un ataque de la vida real).
Para reproducir la vulnerabilidad, puedes hacer esto:
El problema se solucionado al agregar el token de restablecimiento al formulario (además de la cookie):
<input type="hidden" name="rp_key" value="<?php echo esc_attr( $rp_key ); ?>" />
Y el intento de reinicio se invalida cuando rp_key
no coincide:
if ( isset( $_POST['pass1'] ) && ! hash_equals( $rp_key, $_POST['rp_key'] ) ) {
$user = false;
}