【实验目的】
- 了解CP-OJ网络安全攻防实战培训系统中浏览课程内容的方法
- 实现建立实验环境,并可进入实际操控(支持Console和远程终端两种模式)
- 实现虚拟机和终端之间的文件传输
- 成功安装WEB以及DVWA靶机网站,需要网站可远程访问(自学DVWA环境构建,具备网上资料查找的能力)
- 在自己建立的靶机上完成High安全级别的File inclusion实验
- 加分项:完成DVWA中除上述实验的level为“High”的实验,每项加分:2分。最多2项加分,共4分。
【实验步骤】
一、成功安装WEB以及DVWA靶机网站
1、在VMware Workstation Pro中安装老师给的win10虚拟机镜像
2、安装Appserv。其中会弹窗要求安装Microsoft Visual C++。在配置Apache HTTP Server Information 服务器的信息时,设置服务器名称为本地localhost,Apache HTTP 端口设为8080,HTTPS端口设为443。同样进行MySQL配置完成安装。
3、在浏览器内输入http://127.0.0.1:8080/phpinfo.php验证Appserv是否安装成功,该页面成功显示,说明安装成功。
4、将DVWA-1.9文件夹复制粘贴到C:\AppServ\www文件夹下。并修改C:\AppServ\www\DVWA-1.9\config目录下的config.ini.php配置文件,将数据库的 root 管理员用户口令修改为之前安装时设置的口令。
5、打开页面http://127.0.0.1:8080/DVWA-1.9/setup.php,点击页面底部的Create/Reset Database按钮。然后自动跳转到登录页面,使用默认账号登陆DVWA。
二、File inclusion
一开始进入File Inclusion有报错:The PHP function allow_url_include is not enabled
。查了一下需要修改php.ini
文件,把allow_url_include=Off
改为 allow_url_include=On
,然后重启就没有报错了。
1、LOW
首先找到源码,可以发现LOW级别下没有进行任何过滤。
看到了url中的page=file1.php
,修改page的参数就可以在warning中看到访问的file1.php在本地的绝对地址,就想到可以通过相对路径的方法访问其他文件。
2、Medium
看到源码中用“”代替“../”和“..\””使得不能像LOW那样直接用相对路径访问,可以str_replace函数可以通过双写绕过。【但是感觉这里源码有问题,因为\”转义后是”所以这里是../和..”被替换为空,LOW中的相对路径....\hackable\flags\fi.php因为没有被替换,仍然可以运行成功。】
3、HIGH
首先看源码,增加了一个if判断,通过fnmatch
函数检查page的参数开头是否为file,如果是服务器才会去包含相应文件。可以通过file协议来访问本地文件以此绕过,只需要在file://
后加上文件路径,比如说file://C:\AppServ\www\DVWA-1.9\hackable\flags\fi.php
三、加分项:Brute Force
1、一开始做的时候尽管有修改难度,但是左下角一直显示难度是impossible,在查阅资料后删除了浏览器中保存的该页面的cookie,等了两三分钟之后页面恢复正常,可以修改难度。
1、LOW
首先查看源码,可以发现并仅对输入的密码进行了md5加密处理,并没有任何对输入的过滤和防爆破的机制。可以直接用burpsuite中的intruder模块进行爆破。
先随便输一个密码,用burp抓包(这里有遇到一个问题,burp无法抓本地包,后来把网页中的127.0.0.1替换为本机ip地址就可以了)。发送给intruder,选择password为有效载荷,在payload中load网上下载的常见密码的txt文件,之后等待即可。可以在attack界面将条目按照response报文的长度排序,可以看到password的response报文和其他的不同,具体阅读报文发现这就是正确的密码。
2、Medium
首先阅读源代码,medium相较于low而言对密码增加了mysql_real_escape_string函数的处理,转义字符串中的特殊字符,对输入有简单的过滤。并且每次输入失败强制冻结2秒,影响了爆破的效率。但是还是可以采取和low相同的做法爆破,只是用时稍长。
3、High
首先看源代码,在medium的基础上,将用户名和密码通过stripslashes函数删除由 addslashes() 函数添加的反斜杠,起到了进一步过滤的作用。并且添加了token抵御CSRF攻击,每次都会生成一个新的user_token。
因为user_token是由网页实时生成的,所以可以先把网页爬下来提取出user_token,之后每次爆破时都带上进行测试。这里用python写了脚本,先用抓到的包中的数据构造好除了password和user_token的http包头,再加上提取到的user_token和常用的密码字典进行爆破,只进行20次。
运行脚本,同样找到response报文最长的一项,正确的密码是password。
四、加分项:Command Injection
1、LOW
首先随便试了一个127.0.01,点击提交后会显示ping的结果(乱码问题在更改页面的编码后解决了)
再看源码:
所以直接可以通过在ip地址后增加&&连接符,后面再跟想要执行的指令:
2、Medium
先看源码,Medium中增加了对&&和;的过滤,所以我们可以直接通过&代替&&,结果如图。
3、HIGH
分析源码,在HIGH中过滤了更多的符号,但是其中可以发现‘| ’过滤的是|加上一个空格,所以仍然可以通过“|”绕过,如图所示。
五、一些思考
在做完high level的三道题后,再来看impossible level是怎么解决存在的这些漏洞。
Brute Force (impossible):增加了试错次数的上限,如果试错3次则锁定15min,并且采用了更为安全的PDO机制防御sql注入,并且如果登录失败,随机等待2-4秒后再返回错误信息。由此可见,对密码试错限定上限会大幅度降低暴力破解的可能。此外,设置每次需要额外输入验证码应该也可以降低暴力破解的可能。但是如果有人恶意的使一个账户登陆失败一直锁定,会导致拒绝服务攻击。
Command Injection (impossible):区别于前三种难度通过设置黑名单的方法进行输入滤过,impossible level采用了创建白名单的方式限制输入。可以明显看到如果对于输入的格式非常确定,白名单的方式可以比黑名单更有效地抵御攻击。(当然如果黑名单的滤过足够彻底的话也能达到很好的效果)
File inclusion (impossible):这里的impossible level同样采取了白名单的方式,只允许访问include.php、file1.php、file2.php、file3.php,对输入进行了限制,很好地抵御了攻击。
简单总结一下,对于穷举类型的暴力破解,设置试错上限可以很好地进行预防。对于输入的防护,白名单会比黑名单更有效。