Restablecimiento de contraseña CSRF de Wordpress 4.0

4

Estoy trabajando en un proyecto de la facultad. Necesito replicar la vulnerabilidad CSRF de Wordpress en mi wordpress localhost. Intento hacer esto: enlace   No pude encontrar ningún tutorial útil. Estoy pensando en usar un módulo Metasploit en Kali Linux. ¿Alguien me puede guiar?

    
pregunta Danelo 28.05.2017 - 23:13
fuente

1 respuesta

4

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:

  • Solicite un enlace para restablecer la contraseña. (por ejemplo, para el usuario admin )
  • Visite el enlace de restablecimiento (pero no ingrese una nueva contraseña).
  • Simule un ataque CSRF enviando este formulario desde un dominio controlado por un atacante con una contraseña arbitraria:
    <form action="https://yourwordpress.example/wp-login.php?action=resetpass" method="post">
        <input type="hidden" name="user_login" value="admin">
        <input type="password" name="pass1">
        <input type="password" name="pass2">
        <input type="submit" name="wp-submit" value="Reset Password">
    </form>
    

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; 
} 
    
respondido por el Arminius 29.05.2017 - 02:55
fuente

Lea otras preguntas en las etiquetas