[実験]csrf dvwa


  • dvwa lowレベルテスト
  • ソースコード
  • 構築リンク
  • dvwa mediumレベルテスト
  • ソースコード
  • 脆弱性利用
  • dvwa highレベルテスト
  • ソースコード
  • 脆弱性利用
  • dvwa Impossibleレベルテスト
  • ソースコード
  • 脆弱性利用
  • 参照list
  • tips
  • 新しい知識ポイントリスト
  • token
  • php構文作用
  • ショートリンク
  • Anti-SRF token機構
  • 授権と未授権
  • 要求ドメインとCookie情報で指定するドメイン


  • dvwa lowレベルテスト:


    ソースコード

    
    
    if( isset( $_GET[ 'Change' ] ) ) {
        // Get input
        $pass_new  = $_GET[ 'password_new' ];
        $pass_conf = $_GET[ 'password_conf' ];
    
        // Do the passwords match?
        // ?
        if( $pass_new == $pass_conf ) {
            // They do!
            // ,  ?  1 :  2。
            // , 
            // , mysqli_real_escape_string() , 。
    
            $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
            //
            $pass_new = md5( $pass_new );// md5 
    
            // Update the database
            // , 
            $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
            $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '
    '
    . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '' );
    //Feedback for the user
    $html .= "
    Password Changed.
    ";
    }
    else {
    //Issue with passwords matching
    $html .= "
    Passwords did not match.
    ";
    }
    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
    }
    ?>
  • $GLOBALS[“___mysqli_ston”] ???

  • $GLOBALS-グローバル ドメインで なすべての を
    $GLOBALSというグローバル は、PHPスクリプト の の でグローバル にアクセスするために されます( またはメソッドから できます).
    PHPは$GLOBALS[index]という にすべてのグローバル を している. の は のキーです.
    MySQLConverter assumes that this global variable is set to equal your DB connection object; if the converter finds a mysql_connect it will (partially, but with a warning) convert your code into code that includes an assignment of $GLOBALS[“___mysqli_ston”] to the result of the mysqli_connect function something like this:
    link=( GLOBALS[“___mysqli_ston”] = mysqli_connect( hostname, username, $pwd));
    データベース に
  • ?: の
  • : ? 1: 2 : の の が の であり, を たす は 1, たさない は 2である.
  • is_object()

  • - がオブジェクトであるかどうかを します.

    リンクの


    A) も な:
    http://192.168.43.233/DVWA-master/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#
    がこのリンクをクリックすると、 のパスワードはpasswordに されます(この は し に えますが、リンクは でパスワードを していることがわかります. がリンクをクリックすると、このページを ると のパスワードが ざんされていることがわかります).
    はFirefoxブラウザでテストしていましたが、すでにFirefoxブラウザにdvwaのadminアカウントにログインしていましたが、パソコンのデフォルトブラウザはchromeなので、テスト のリンクの にcsrf を するために することはできませんでした.ブラウザによってクッキーが なるからです.
    B)ショートリンクを ってURLを すことができます
    ロングアドレスはhttp://suo.im/2n9XW2
    C) ページの
    な シーンでは、この は に に ページをアップロードし、 をだましてアクセスさせ、 が らないうちにCSRF を させる がある.ここではプレゼンテーションを にするためにtestをローカルに きます.html、 は なコードです.
    <img src="http://192.168.153.130/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0" style="display:none;"/>
    
    <h1>404<h1>
    
    <h2>file not found.<h2>

    がtestを するとhtmlの 、 がクリックしたのは なurlだと いしますが、 にCSRF を け、パスワードがhackに されています.

    dvwa mediumレベルテスト:


    ソースコード

    
    
    if( isset( $_GET[ 'Change' ] ) ) {
        // Checks to see where the request came from
        //if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ])!=-1 ) {
    
    
        //stripos —  ( )
        //int stripos ( string $haystack , string $needle [, int $offset = 0 ] )
    //  haystack   needle  。
    
        // HTTP_REFERER SERVER_NAME ,-1 , -1 。
    
        // , 
        if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ) { 
    
    
            // Get input
            $pass_new  = $_GET[ 'password_new' ];
            $pass_conf = $_GET[ 'password_conf' ];
    
            // Do the passwords match?
            if( $pass_new == $pass_conf ) {
                // They do!
                $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
                $pass_new = md5( $pass_new );
    
                // Update the database
                $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
                $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '
    '
    . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '' );
    //Feedback for the user
    $html .= "
    Password Changed.
    ";
    }
    else {
    //Issue with passwords matching
    $html .= "
    Passwords did not match.
    ";
    }
    }
    else {
    //Didn't come from a trusted source
    //HTTP_REFERERでSERVER_NAMEに 、 できないソース
    $html .= "
    That request didn't look correct.
    ";
    }
    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
    }
    ?>
    Mediumレベルのコードが HTTP_をチェックしていることがわかりますREFERER(httpヘッダのReferパラメータの 、ソースアドレスを す)にSERVER_が まれているかどうかNAME(httpパケットヘッダのHostパラメータ、およびアクセスするホスト 、ここでは192.168.153.130)は、このメカニズムによってCSRF を ぐことを んでいる.


    フィルタリングルールはhttpパケットヘッダのReferパラメータの にホスト を める があります
    ホスト :http://192.168.43.233
    ページの をホスト にすることができます.html
    ネイティブユーザー:firefoxブラウザで マシン192.168.43.233のdvwa マシンにアクセス:192.168.43.153にtestがある.htmlページには コードがあり、パスワードをpassword 1に できます.
    のあるページをクリックすると、パスワードがチュートリアルと なることに づき、 、 のmediumソースコードがチュートリアルと し なることに づいたので、チュートリアルに って のソースコードを しました.
    、 で のあるマシンの ページをクリックすると、パスワードを できないことが しました.
    のあるページ を します.htmlは192.168.43.233.html、パスワードの に しました
    プロセス :

    dvwa highレベルテスト:


    ソースコード


    のコードは きく されていませんが、 いは
    
    // Check Anti-CSRF token
        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    
    // Generate Anti-CSRF token
    generateSessionToken();
    

    HighレベルのコードにはAnti-CSCF tokenメカニズムが み まれており、ユーザーが ページにアクセスするたびに、サーバはランダムなtokenを し、サーバに を する にtokenパラメータを する がありますが、サーバは を すると、tokenを にチェックし、tokenが である り、クライアントの を します.
  • Anti-SRF tokenメカニズム?
  • token?

  • Webセキュリティのtoken


    Highレベルの CSRFメカニズムを するには、tokenを し、 のクッキーを してパスワードのページを してキーのtokenを することが です.
    ページを し、 のサーバに し、 を してCSRF を させてみましょう.
    の は、 がこのページにアクセスすると、スクリプトは えないフレームワークを じてパスワードを するページにこっそりアクセスし、ページのtokenを し、サーバーに を してCSRF を することである.
    しかし、 と の は きく、ここではドメイン の に していますが、 のブラウザではドメイン リクエストは されていません.ここでは、ドメイン で に します. たちのフレームワークiframeがアクセスするアドレスはhttp://192.168.153.130/dvwa/vulnerabilities/csrfで、サーバー192.168.153.130にあります. たちの ページはハッカーサーバー10.4.253.2にあります. のドメイン は なり、ドメイン Bの のすべてのページは、ドメイン Aの のページの を に することはできません.ドメイン Aの のページがドメイン Bのページに に を しない り、だから たちの スクリプトは、 インタフェースのuser_を することはできません.token.
    ドメイン では できないため、ターゲットサーバ192.168.153.130に コードを してこそ、 を することができます.
    、HighレベルのXSS を してAnti-CSCF tokenの に する(ここでのXSS は さ があり、 な スクリプトを できないため、Anti-CSCF tokenのみを する).
    xss token
    ページで、
    データベースで、
    すなわち, さに がなければ,ユーザのtokenを しながら, を うことができる.

    dvwa Impossibleレベルテスト:


    ソースコード

    
    
    
    if( isset( $_GET[ 'Change' ] ) ) {
        // Check Anti-CSRF token
        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    
        // Get input
        $pass_curr = $_GET[ 'password_current' ];
        $pass_new  = $_GET[ 'password_new' ];
        $pass_conf = $_GET[ 'password_conf' ];
    
        // Sanitise current password input
        $pass_curr = stripslashes( $pass_curr );
        $pass_curr = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_curr ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        $pass_curr = md5( $pass_curr );
    
        // Check that the current password is correct
        $data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
        $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
        $data->bindParam( ':password', $pass_curr, PDO::PARAM_STR );
        $data->execute();
    
        // Do both new passwords match and does the current password match the user?
        if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {
            // It does!
            $pass_new = stripslashes( $pass_new );
            $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
            $pass_new = md5( $pass_new );
    
            // Update database with new password
            $data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' );
            $data->bindParam( ':password', $pass_new, PDO::PARAM_STR );
            $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
            $data->execute();
    
            // Feedback for the user
            $html .= "
    Password Changed.
    ";
    }
    else {
    //Issue with passwords matching
    $html .= "
    Passwords did not match or current password incorrect.
    ";
    }
    }
    //Generate Anti-CSRF token
    generateSessionToken();
    ?>
    ImpossibleレベルのコードはPDO を してSQL を し,CSRFを するにはユーザに のパスワードを するように し( で ), は のパスワードを らない ,どうしてもCSRF を うことができない.


    None

    リスト:


    ガイド:DVWA-1.9フルレベルチュートリアルのCSRF

    tips:


    にチュートリアルに って、CSRFに して な があります.

    しいナレッジポイントリスト:


    1.token


    2.php :?:こうぶんさよう


    3.ショートリンク


    4.Anti-CSCF token


    5. と


    web security で されています