一、漏洞描述
程序在引用文件的时候,引用的文件名,用户可控的情况,传入的文件名没有经过合理的校验或者校验不严,从而操作了预想之外的文件,就有可能导致文件泄露和恶意的代码注入。
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这重文件调用的过程一般被称为文件包含。程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞PHP Web Application中居多,而在JSP、ASP、ASP.NET程序中却非常少,甚至没有,这是有些语言设计的弊端。
二、常见文件包含函数
三、漏洞危害
1、敏感信息泄露
2、拒绝服务攻击
3、执行恶意代码
4、配合文件上传,扩大危害
一般来说,远程文件包含漏洞危害更大。
四、利用前提
1、web应采用include()等文件包含函数通过动态变量的方式引入需要包含的文件
2、用户能够控制该动态变量
五、两个关键选项
Allow_url_fopen = on
是否允许将URL(HTTP,HTTPS等)作为文件打开处理,默认开启
Allow_url_include= on
是否允许include()和require()函数包含URL(HTTP,HTTPS)作为文件处理,默认关闭,远程文件包含必须为开启。
六、挖掘
抓包观察有无明显的参数用于打开或使用文件,在漏洞挖掘过程中,注意下即可,如果遇到疑似文件包含,可以使用以下的测试方法。
a.php是fileinclude.php的同⼀⽬录的⽂件 http://www.aaa.com/fileinclude.php?file=file://a.php
打开⽬标⽹站,⼀般不会被过滤掉 http://www.aaa.com/fileinclude.php?file=http://www.aaa.com
因为不知道对参数的过滤方式,因此该方法不一定成功。
七、本地文件包含(LFI)
能够读取或执行包含本地文件的漏洞,称为本地文件包含漏洞。
重要特点:把任何包含进来的文件都当作PHP文件来执行。
下面是pikachu靶场的源码
$_GET[‘filename’] 接收客户端传的参数,其中没有任何过滤带⼊到 include 函数中, include 包含这个⽂件,引⼊到当前⽂件中,因此会造成⽂件包含漏洞; ⽐如:http://pikachu.com/vul/fileinclude/fi_local.php?filename=123.jpg 1.jpg是图⽚,但是当有⽂件包含漏洞时,这个图⽚会被当做 php ⽂件处理,当然前提是它 ⾥⾯有 php 的代码,这样我们就可以先写⼀个 php 代码的⽊⻢,然后伪装成图⽚上传,从⽽ 达到控制对⽅的⽬的。
八、php伪协议
1、简介
PHP带有很多内置URL风格的封装协议,可用于类似fopen()、copy()、file_exists()和filesize()的文件系统函数,除了这些封装协议,还能通过stream_wrapper_register()来注册自定义的封装协议。
可以在phpinfo中的Registered PHP Streams中找到可使用的协议。
2、测试环境
测试代码
php.ini配置
各协议的利用条件和方法