1. 文件包含介绍
文件包含是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(如:include(),require(),include_once(),require_once())利用url去动态包含文件,如果此时没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
文件包含漏洞分为本地文件包含漏洞和远程文件包含漏洞,远程文件包含漏洞是因为开启了PHP配置中的allow_url_fopen选项,开启了这个选项之后,服务器允许包含一个远程的文件。
2. 文件包含原理
开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写。开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动太调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞。
3. DVWA实例操作
3.1 low level
在url后面的参数page=后面随便输入几个字母,报错,同时也暴露了服务器文件的绝对路径:C:\phpStudy\PHPTutorial\WWW\DVWA
构造url,修改page=后面的参数,hcl.txt是自己创建的一个文件,成功显示txt文件里面的内容。
查看ini里面的内容
我们看到配置文件中的Magic_guote_gpc选项为off,在php版本小于5.3.4的服务器中,当开启这个选项时,我们可以在文件名中使用%00进行截断,也就是说文件名中%00后的内容不会被识别。使用%00截断可以绕过某些过滤规则,例如要求page参数后面的后缀必须为php,这时就可以使用%00,在文件后面添加%00x.php就可以绕过
远程文件包含:
在kali上开启Apache服务,然后写入一个phpinfo.txt文件,浏览器访问,正常显示
然后,我们把这个链接包含到之前的page=后面即可
3.2 medium level
这几级别的代码增加了str_replace函数,对page参数进行了一定的处理,将“http://”、“https://”、"…/"、"…"替换为空字符,即删除。但是这个函数时不安全的,我们可以使用双写绕过替换,像 http:// 写成 htthttp://p://,当函数把http://删掉之后,就剩下http:// 从而进行了绕过。其他的绕过也是一样
3.3 high level
high级别的代码使用了fnmatch函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件。
这个我们可以利用file协议绕过防护策略。
file协议,简单的说明就是,当我们用浏览器打开一个本地文件时,用的就是file协议。
4. 个人感受
这个实验的过程中,虚拟机崩溃了,mysql一直运行不起来,因此后面的就是没有截图,做了一些思路,文件包含理解起来不难,我也就没再进行下去。