將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();
?>
7.另外,除了使用工具burpsuite之外,還可以編寫python腳本來實現自動化爆破,具體步驟可參考該文章。
https://blog.csdn.net/weixin_40586270/article/details/81701765