介绍
Damn Vulnerable WebApplication(DVWA)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在安全专业人员测试自己的专业技能和工具提供合法的环境,帮助Web开发者更好的理解Web应用安全防范的过程。
DVWA共有十个模块,分别是Brute Force、CommandInjection、CSRF、File Inclusion、File Upload、Insecure CAPTCHE、SQL Injection、SQL Injection(Blind)、XSS(Reflected)。DVWA分为low、medium、high和impossible四个等级。
环境搭建
2.1 安装XAMPP
XAMPP是一个集成的易于安装的WEB环境部署包,其中包括了Apache,MySQL,PHP,Perl等。这样可以方便部署,不用单个去安装需要的服务。
下载xampp-win32-7.1.11-0-VC14-installer.exe进行安装即可。安装完成后开启Apache和MySQL服务以供DVWA部署使用。
2.2 部署DVWA
将下载好的DVWA-master.zip解压到DVWA文件夹中,将php文件所在文件夹放入Apache服务的默认网站目录D:\xampp\htdocs中即可。之后利用浏览器打开http://127.0.0.1/dvwa/setup.php进行安装。出现如下提示,按要求进行后再次进行安装,得到如下页面。
数据库在这里可以创建或者重置,在dvwa目录下的config\config.inc.php中可以查看数据库的初始设置,这里点击Create/Reset Database。点击后显示不能连接到mysql,其实是要dvwa的数据写入到MySQL服务中去,但是MySQL的默认用户名和密码与dvwa下的登录MySQL密码不多,要想使用MySQL就需要修改config.inc.php中的用户和登录密码为XAMPP中MySQL的默认用户名和密码。
XAMPP中MySQL用户名和密码在\xampp\phpMyAdmin下的config.inc.php中,phpMyAdmin是使用PHP语言编写,可以通过互联网控制和操作MySQL的,进入发现默认用户名为root,密码为空,要想修改密码,需要先进入phpMyAdmin页面,点击账户,然后选择root账户修改权限,选择修改密码,这里可以生成复杂密码,设置为root/5211,而后将config.inc.php中的密码设置为5211,设置如图
另外设置dvwa登录MySQL的配置文件config.inc.php,将其设置为root/5211后,再次点击Create/ResetDatabase即可。设置和效果如图
2.3 登录
登录http://127.0.0.1/dvwa/login.php即可完成登录,DVWA的默认账号在如下路径中可以找到,结果如图
利用admin/password登录成功,结果如图
Brute Force
暴力破解,是指利用密码字典,使用穷举法猜出密码口令,是现在最广泛的的攻击手段之一,一般都是将数据库全部拷贝下来完成脱库,然后洗库,最后撞库时候用暴力破解完成。
3.1 Low等级
3.1.1 漏洞分析
设置为Low状态,代码如下,发现只是验证了Login是否被设置,没有任何防爆破机制,且对username和password没有任何过滤机制,只是对password执行了md5处理,有明显的SQL注入。
3.1.2 利用Burp进行爆破
在用户名密码处随意输入,截取登录请求如下
将其复制到Intruder中,设置username和password参数为payload,设置爆破方式为ClusterBomb,如图
之后点击Payloads选项卡载入字典,这里选择的是交叉模式,会将所有的组合进行尝试,如图
点击Start attack,进行爆破,这里选择的是Burp自带的字典,本身就有很多内容,同时要执行交叉模式种类就会更多,所以该方法除非是去进行撞库或者知道某用户用户名去进行才比较合适。这里自己导入一些用户名和密码进行测试即可。因为登录失败都会返回Username and/or password incorrect.所以可以在Options选项卡的Grep-Extract添加此筛选条件,对没有该返回项的请求进行分析,发现为正确用户名和密码。当然我们也可以根据返回包的长度发现,错误请求的返回包长度都一致,而正确请求的会出现差别。结果如下
3.1.3 利用SQL注入进行登录
在知道用户名的情况下可以利用sql注入实现登录,Username填写admin’ #,Password填写空,则登录成功效果如下
当然可以设置Username为admin’ or ‘1’ = ‘1,Password填写空,因为TRUE or Trueand False和True or False and False都为True,所以’1′ = ‘2或者1=’2都可以,只要最后满足sql语句即可,登录成功效果如下
3.2 Medium等级
3.2.1 漏洞分析
设置为Medium等级,查看源码如下
根据源码发现,在Low等级的基础上,利用mysqli_real_escape_string是将sql语句中的一些特殊字符进行转义(’、” ),这样就可以达到防止sql注入的目的,具体的原理如下,不转义输入admin’ #后,会执行如下的sql语句SELECT * FROM `users` WHERE user= ‘admin’ #’ AND password = ‘$pass’;从而完成注入。如果执行转义则会变成如下sql语句SELECT * FROM `users` WHERE user= ‘admin\’ #’ AND password = ‘$pass’;从而无法完成注入。但是这种办法可以利用编码的漏洞来实现注入,如果将编码方式改为默认以外的方式,服务器就无法进行识别,从而不能进行转义,仍然变成第一个语句的情况实现绕过(好像高版本以及修复该问题,而且如果是mysqli应该没有相关漏洞)。之后源码里使用了sleep(2)的策略,但是仍然无法避免爆破。
3.2.2 利用Burp进行爆破
使用Low中的配置进行爆破,当然由于还是采用休眠两秒爆破的时间会有点慢,如果在不知道一定信息的话,这种方式很不可取,爆破仍然按Low等级那样处理,结果如图
3.3 High等级
3.3.1 漏洞分析
设置为High等级,查看源码如下
可以发现这里在发送请求时候加入了Token验证,每次请求的token都是上次返回页面中得到的,所以这里想要爆破的话首先要获得上次页面中返回的token才可以。用户名做了stripslashes(过滤反斜杠)和mysqli_real_escape_string操作可以防止sql注入。
3.3.2 Beautiful Soup获取响应token进行爆破
这里需要获取上一次请求返回的token,这里我们刷新登录界面,截取请求如下
然后查看返回页面中token的位置
再截取登录请求,了解登录请求数据
这里利用Python的BeautifulSoup库,创建抓取网页中token的函数,先从刷新的登录页面中抓取token,而后发送登录请求,得到响应的状态码长度和token,然后用获得的token进行下次请求完成爆破,这里可以在Python中打印结果,也可以从Burp中获取每次请求长度来判断结果。
3.4 Impossible等级
设置为Impossible,查看源码,发现设置了错误次数,当检测到3次错误以后账户被锁定15分,可以有效的防止爆破。
另外在sql查询时候,采用了PDO机制,该机制将查询的变量参数化,首先发送sql模板,然后把传入的参数只做查询处理,不做语意解释,传递的任何参数都会被当做字符串进行处理,这样每次查询的sql语句就会固定,不会发生注入现象。
更多内容请持续关注本专栏,谢谢~
来源:freebuf.com 2020-01-17 15:31:12 by: Scorpio君临天下
请登录后发表评论
注册