本次搭建OWASP靶機中自帶的DWVA靶機對暴力破解進行測試
Simple級別
源代碼查看
<?php
if( isset( $_GET['Login'] ) ) {
$user = $_GET['username'];
$pass = $_GET['password'];
$pass = md5($pass);
$qry = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
$result = mysql_query( $qry ) or die( '<pre>' . mysql_error() . '</pre>' );
if( $result && mysql_num_rows( $result ) == 1 ) {
// Get users details
$i=0; // Bug fix.
$avatar = mysql_result( $result, $i, "avatar" );
// Login Successful
echo "<p>Welcome to the password protected area " . $user . "</p>";
echo '<img src="' . $avatar . '" />';
} else {
//Login failed
echo "<pre><br>Username and/or password incorrect.</pre>";
}
mysql_close();
}
?>
根據(jù)源代碼查看出現(xiàn)關鍵代碼
$qry = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
說明除了此題可以進行暴力破解,而且能夠進行SQL注入測試
SQL注入方法破解
很明顯SQL查詢語句是可以對賬戶,密碼進行拼接,所以可以嘗試通過萬能密碼和注釋符進行測試
user = ' or '1'='1‘’ #
為了便于查看SQL語句耸棒,對源代碼進行編輯件舵,能夠打印出拼接后的結果
根據(jù)測試結果和源代碼審計發(fā)現(xiàn)利职,雖然成功進行了注入,逃過密碼驗證漱凝,但是由于if判斷時纸兔,返回結果只能返回一個惰瓜,所以導致報錯。
所以根據(jù)代碼進行改正測試的注入代碼
'or '1' ='1' limit 0,1#
當然除了可以進行使用萬能密碼外汉矿,可以在知道用戶名時嘗試其他的注入方法鸵熟,例如
admin' #
admin' --
口令暴力破解
首先捕獲請求數(shù)據(jù)包,對要進行的變量進行標記
對指定變量進行字典替換并請求
Medium級別
源代碼查看
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Sanitise username input
$user = $_GET[ 'username' ];
$user = mysql_real_escape_string( $user );
// Sanitise password input
$pass = $_GET[ 'password' ];
$pass = mysql_real_escape_string( $pass );
$pass = md5( $pass );
$qry = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
$result = mysql_query( $qry ) or die( '<pre>' . mysql_error() . '</pre>' );
if( $result && mysql_num_rows($result) == 1 ) {
// Get users details
$i=0; // Bug fix.
$avatar = mysql_result( $result, $i, "avatar" );
// Login Successful
echo "<p>Welcome to the password protected area " . $user . "</p>";
echo '<img src="' . $avatar . '" />';
} else {
//Login failed
echo "<pre><br>Username and/or password incorrect.</pre>";
}
mysql_close();
}
?>
根據(jù)源代碼查看出現(xiàn)關鍵代碼
$user = mysql_real_escape_string( $user );
此函數(shù)對輸入的字符進行轉義
因此對該函數(shù)在MySQL5.5.37以下版本有繞過方法
對于\’進行繞過時猖吴,可以考慮寬字節(jié)注入者春,常用的%df進行測試
因為寬字節(jié)注入是在GBK編碼下進行利用,所以可以查看數(shù)據(jù)庫編碼
show variables like 'char%'
但是該等級并未對暴力破解增加任何防護,所以同Low等級逞姿,直接暴力破解即可。
High級別
源代碼查看
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Sanitise username input
$user = $_GET[ 'username' ];
$user = stripslashes( $user );
$user = mysql_real_escape_string( $user );
// Sanitise password input
$pass = $_GET[ 'password' ];
$pass = stripslashes( $pass );
$pass = mysql_real_escape_string( $pass );
$pass = md5( $pass );
$qry = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
$result = mysql_query($qry) or die('<pre>' . mysql_error() . '</pre>' );
if( $result && mysql_num_rows( $result ) == 1 ) {
// Get users details
$i=0; // Bug fix.
$avatar = mysql_result( $result, $i, "avatar" );
// Login Successful
echo "<p>Welcome to the password protected area " . $user . "</p>";
echo '<img src="' . $avatar . '" />';
} else {
// Login failed
sleep(3);
echo "<pre><br>Username and/or password incorrect.</pre>";
}
mysql_close();
}
?>
根據(jù)源代碼查看出現(xiàn)關鍵代碼
$user = stripslashes( $user );
此函數(shù)對輸入的字符進行轉義
在暴力破解方面坐儿,增加了關鍵代碼
sleep(3);
每爆破錯誤一次 薪前,就停止3s驗證,導致整個爆破時間拉長柴淘,從而增加工具者的時間成本迫淹,但不是最安全的
個人認為最安全的方法是SQL注入部分進行實體化參數(shù)代入,暴力破解防御應適當加入驗證碼为严,以及當日最大錯誤次數(shù)等機制進行防御敛熬。