File inclusion,文件包含(漏洞)。程序开发人员通常出于灵活性的考虑,会将被包含的文件设置成变量,然后动态调用这些文件。但正是因为调用的灵活性导致用户可能调用一些恶意文件,造成文件包含漏洞。文件包含漏洞分为本地文件包含漏洞和远程文件包含漏洞。
1、Low等级本地文件包含和远程文件包含;
我们在C盘创建一个txt名为key,内容为123456,通过DVWA的low级别进行包含,在浏览器page=后面加上txt的路径,可以看到页面直接输出123456
可以看到成功输出test.txt文件内容,接下来测试远程文件包含,注意,需要allow_url_include为on:
下面测试远程包含,由于搭建的服务也是在本地所以直接使用IP访问,不过访问的ip根目录为phpstudy的网站根目录,所以测试文件要放在根目录下面,例:http://192.168.196.1/test.php,可以看到成功包含进来:
把文件放在php的根目录那,如果不知道,我们可以打开phpstudy
文件test.php的内容:
在新建一个key.txt文件:
2、Medium等级本地文件包含和远程文件包含;
修改等级:
查看源码:
可以看到使用str_replace()函数将http:// https:// ../ ..\替换成空字符
我们可以通过使用双写绕过替换规则,
例如写成page=hthttp://tp://192.168.196.1/phpinfo.php时,函数会将http://删除,其实等于page=http://192.168.196.1/phpinfo.php,先在kali写入php探针,成功执行远程命令
在新建一个key.txt文件(同上目录):
3、High级别本地文件包含和远程文件包含;
修改等级:
我们可以查看其源码:
可以看到:使用fnmatch()确保$file是以file开头,我们可以通过利用file伪协议绕过
4、Impossible等级的机制以及修复、防御文件包含的方法。
先修改等级
源码:
可以看到,这里用if语句来判断用户输入的数据是否是include.php,通过定义白名单进行防范
常见防范措施
1、基于白名单进行防御,确保page参数传递的只能是固定的文件名
2、文件包含可以与文件上传结合,可以上传图片文件,执行代码。要全面防御