DVWA暴力破解(Brute_Force High級別)
阿新 • • 發佈:2019-01-14
將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(); ?>