Un utente Wordpress può accedere a questo URL e richiedere un link per reimpostare la password via email:
https://yourwordpress.example/wp-login.php?action=lostpassword
Il link di ripristino sarà simile a questo:
https://yourwordpress.example/wp-login.php?action=rp&key=dDnnToiqjYtsa9KdfVZl&login=admin
Il parametro key
nell'URL assicura che solo il ricevitore dell'email sia in grado di reimpostare la password. Dopo aver visitato il link di ripristino, ti verrà presentato un modulo per inserire la nuova password.
Prima di Wordpress 4.0.1, questo modulo non forniva un token anti-CSRF. Invece, il parametro key
GET viene salvato in un cookie e dopo aver inviato la nuova password viene verificato il valore del cookie.
Ciò significa che un utente è vulnerabile nel tempo che intercorre tra il clic sul collegamento per la reimpostazione della password e l'inserimento della nuova password. In quel lasso di tempo, e solo allora , un utente malintenzionato potrebbe potenzialmente lanciare un attacco CSRF per modificare la password su un valore arbitrario. (Ma a causa di questa piccola finestra di opportunità il bug ha un valore limitato in un attacco reale.)
Quindi, per riprodurre la vulnerabilità, puoi fare ciò:
Il problema era corretto aggiungendo il token di ripristino al modulo (oltre al cookie):
<input type="hidden" name="rp_key" value="<?php echo esc_attr( $rp_key ); ?>" />
E il tentativo di ripristino è invalidato quando rp_key
non corrisponde:
if ( isset( $_POST['pass1'] ) && ! hash_equals( $rp_key, $_POST['rp_key'] ) ) {
$user = false;
}