DVWA-暴力破解通关
DVWA-暴力破解通关
lololoweBrute Force,即暴力破解,是指黑客利用密码字典,使用穷举法猜解出用户口令。
1. Low
1.1. 手工注入(万能密码)
输入DVWA的默认用户名和密码admin/password
,查看登录结果:
显示了欢迎横幅以及图片,说明登录成功。
尝试输入随机输入用户名和密码,查看登录结果:
由上图可知,输入合法账号密码后,如果账号不正确,会返回Username and/or password incorrect.
由于输入合法数据后得到的信息较少,因此需要进一步测试,尝试将用户名输入为单引号'
(单引号通常用于字符串的包围),密码输入123
,查看登录结果:
由返回结果可知服务端使用的数据库为MySQL,并且还显示了一串32位16进制字符,尝试使用在线MD5解密工具,查看解密结果:
解密后的结果等于输入的密码123
,说明数据库中存储的密码为非明文的MD5加密值。
继续使用万能密码'OR 1 = 1 #
进行登录,看能否成功:
万能密码存在的原理是因为,通常在进行登录验证的过程中需要进行将用户输入的账号和密码与数据库中存在的账号和密码进行比对,使用的SQL语句类似于
select ... where user = '$user' AND password = '$pass'
。只有当user = '$user'
与password = '$pass'
都为真值时,where条件才为真值,才能完成登录验证。万能密码就是构造输入数据,将where条件构造为真值,将万能密码带入到SQL语句中后等同于select ... where user = '1' or '1' = '1' #' AND password = '$pass'
,在这条语句中,OR 1=1
总是为真,且#
是 SQL 中的注释符号,表示注释掉后面的部分,这意味着,不管$pass
的值是什么,条件1=1
永远为真,查询将返回所有用户记录,从而成功绕过身份验证。
登陆失败了,说明万能密码OR 1 = 1 #
,没有起作用,需要进一步分析。
在select ... where 表达式
中,输入的万能密码保证了where条件始终为真值,但却使得where语句失去了过滤筛选作用,这可能导致查询出了所有用户的数据,从而导致了登陆失败,为了绕过该限制,可以使用limit关键字,只取出查到的第一条数据。修改万能密码为 'OR 1 = 1 LIMIT 1 #
,再次尝试登录:
万能密码奏效,登录成功。
1.2. Burp Suite 爆破
使用Burp Suite的内置浏览器(无需配置代理)打开登录页面,输入用户名mkbk
,密码123
,抓包并发送到intruder模块(测试器),将用户名和密码分别设置为变量(Payload position),攻击类型选集束炸弹:
选中 Payloads, 载入2个字典(确保字典中包含了正确的用户名和密码在里面),作用于2个变量:
选中 设置 ,清空 检索 列表,添加新条目Username and/or password incorrect.
:
点击右上角开始攻击进行爆破:
可以看到第61条请求的响应报文长度(length)”与众不同”, 并且检索字符也没有匹配,可以推测 admin
和 password
为正确用户名和密码, 手动验证成功登录:
2. Medium
2.1. Burp Suite 爆破
在中等安全级别中尝试使用万能密码'OR 1 = 1 LIMIT 1 #
进行登录:
登陆失败,说明系统对单引号或者注释符做了过滤,无法使用万能密码进行注入。
那只能使用 Burp suite 进行爆破了, 方法与 Low 级别一致, 此处不再赘述。
破解过程中会发现数据是每隔几秒显示一条,可以猜测系统中为了增加暴力破解的时间成本,使用了时间延迟函数,如
sleep()
函数。
3. High
3.1. Burp Suite 爆破
在高级安全级别中使用Burp suit爆破,抓包数据与网页返回结果如下所示:
可以看到,除了需要提交username、password,还需要提交user_token,否则返回CSRF token错误。
将密码和token设为变量,攻击方式为Pitchfork(干草叉)
选择Grep-Extract,用于提取响应消息中的有用信息,点击Add,配置如下:
将Redirections设置为Always:
为两个变量添加2个字典:
设置并发请求数(线程)为1:
开始攻击:
可以看到第十次请求后的响应长度4912Byte与众不同,可推断此条记录为正确的密码。
3.2. Python脚本爆破
为了能获取当前会话的token值,可以使用python编写脚本进行破解:
1 | import requests |
使用此脚本需要手动安装
requests
、re
和BeautifulSoup
库,并且需要在脚本所在目录中新建一个名为password.txt的字典,确保此字典中包含了正确的管理员密码。
可以看到第4条结果中的服务器返回的页面内容长度4515Byte与众不同,可推断此条记录为正确的管理员密码。
4. Impossible
Impossible级别在High级别的基础上增加了账户锁定机制,连续输入错误密码超过3次,账户将被锁定15分钟。大大增加了暴力破解的时间成本。