1. 程式人生 > >DVWA暴力破解(Brute_Force High級別)

DVWA暴力破解(Brute_Force High級別)

將DVWA調至high級別,發現用之前的暴力破解就不好使了,因為其使用了隨機token機制來防止CSRF,從而在一定程度上防止了重放攻擊,增加了爆破難度。但是依然可以使用burpsuite來爆破。

1. 將登入請求進行攔截,發現增加了user_token引數,所以爆破要選擇兩個引數來進行,先將請求傳送到intruder。

2. 設定兩個引數 password和user_token為變數,攻擊型別選擇pitchfork,意思是草叉模式(Pitchfork )——它可以使用多組Payload集合,在每一個不同的Payload標誌位置上(最多20個),遍歷所有的Payload。舉例來說,如果有兩個Payload標誌位置,第一個Payload值為A和B,第二個Payload值為C和D,則發起攻擊時,將共發起兩次攻擊,第一次使用的Payload分別為A和C,第二次使用的Payload分別為B和D。

3.設定引數,在option選項卡中將攻擊執行緒thread設定為1,因為Recursive_Grep模式不支援多執行緒攻擊,然後選擇Grep-Extract,意思是用於提取響應訊息中的有用資訊,點選Add,如下圖進行設定,最後將Redirections設定為Always

 

4. 然後設定payload,第一個引數設定不在贅述,第二個引數選擇Recursive grep,然後將options中的token作為第一次請求的初始值。

5. 點選start attack攻擊爆破,結果成功爆破,如下圖所示

6. 檢視 High級別的原始碼,看以看出做了CSRF防禦,但是並未做限制頻次或鎖定賬號機制,所以增加了爆破難度,但是依然可以爆破。

<?php 

if( isset( $_GET[ 'Login' ] ) ) { 
    // Check Anti-CSRF token 
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 

    // Sanitise username input 
    $user = $_GET[ 'username' ]; 
    $user = stripslashes( $user ); 
    $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); 

    // Sanitise password input 
    $pass = $_GET[ 'password' ]; 
    $pass = stripslashes( $pass ); 
    $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); 
    $pass = md5( $pass ); 

    // Check database 
    $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"; 
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    if( $result && mysqli_num_rows( $result ) == 1 ) { 
        // Get users details 
        $row    = mysqli_fetch_assoc( $result ); 
        $avatar = $row["avatar"]; 

        // Login successful 
        echo "<p>Welcome to the password protected area {$user}</p>"; 
        echo "<img src=\"{$avatar}\" />"; 
    } 
    else { 
        // Login failed 
        sleep( rand( 0, 3 ) ); 
        echo "<pre><br />Username and/or password incorrect.</pre>"; 
    } 

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); 
} 

// Generate Anti-CSRF token 
generateSessionToken(); 

?>