web-dev-qa-db-ja.com

Wordpress 4.0 CSRFパスワードのリセット

私は教員プロジェクトに取り組んでいます。 Wordpress localhostワードプレスのCSRF脆弱性を複製する必要があります。これを実行しようとしています: https://wpvulndb.com/vulnerabilities/7691 できませんでしたKali LinuxでMetasploitモジュールを使用することを考えています。誰かが私をガイドしてくれませんか?

3
Danelo

A WordpressユーザーはこのURLにアクセスして、電子メールでパスワードリセットリンクをリクエストできます。

https://yourwordpress.example/wp-login.php?action=lostpassword

リセットリンクは次のようになります。

https://yourwordpress.example/wp-login.php?action=rp&key=dDnnToiqjYtsa9KdfVZl&login=admin

URLのkeyパラメータにより、電子メールの受信者のみがパスワードをリセットできるようになります。リセットリンクにアクセスすると、新しいパスワードを入力するためのフォームが表示されます。

Wordpress 4.0.1の前は、このフォームはCSRFトークンを提供していませんでした。代わりに、key GETパラメータがcookieに保存され、新しいパスワードを送信した後Cookieの値が検証されます。これは、ユーザーがパスワードリセットリンクをクリックしてから新しいパスワードを入力するまでの間に脆弱であることを意味します。その期間、それから初めて、攻撃者はCSRF攻撃を実行してパスワードを任意の値に変更する可能性があります(ただし、この小さな機会のために、実際の攻撃ではバグの値が制限されています)。

脆弱性を再現するには、次のようにします。

  • パスワードリセットリンクをリクエストします。 (例:ユーザーadminの場合)
  • リセットリンクにアクセスします(ただし、新しいパスワードは入力しないでください)。
  • 攻撃者が制御するドメインから任意のパスワードを使用してこのフォームを送信することにより、CSRF攻撃をシミュレートします。
     <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> 
    

問題は fixed (cookieに加えて)フォームにリセットトークンを追加することでした:

<input type="hidden" name="rp_key" value="<?php echo esc_attr( $rp_key ); ?>" /> 

そして、リセットの試みは、rp_keyが一致しません:

if ( isset( $_POST['pass1'] ) && ! hash_equals( $rp_key, $_POST['rp_key'] ) ) { 
    $user = false; 
} 
4
Arminius