一、什么是文件包含漏洞
在了解这个漏洞之前我们先要理解什么是文件包含,文件包含的初衷是为了减少程序代码的冗余。
试想一下,我在每一个代码文件中都要用到同一段代码,如果我把这段都要用到的代码转换成一个文件,让每一个用到它的代码都将其包含在里边,不就可以减少很多代码量,减少很多工作量了吗?
在php中,包含一个文件有四种函数:
include()、include_once()、require()、require_once()
include()和include_once()的区别在于,include_once()只会引用同样的文件一次,为了避免函数和变量的重新定义,require和require_once()同理。
include()函数包含的文件如果不存在,程序会发出警告,但是会继续运行。
require()函数包含的文件如果不存在,程序会抛出异常,停止运行。
在用这四个函数来包含文件的时候,不论文件类型为什么,其中的内容都会被当作php代码来解析
根据包含文件位置的不同,文件包含漏洞可以分为两类。远程文件包含(RFI)和本地文件包含(LFI)。
二、本地文件包含(LFI)
在https://www.zllovell.com/phpstudy/ 服务器目录下有一个zl.txt文件,内容如上图,当前目录还有一个test.php文件内容如下
这时候我们访问https://www.zllovell.com/phpstudy/test.php?file=zl.txt,结果如下
这就是本地文件包含漏洞,可以读取服务器本地的文件。
三、远程文件包含(RFI)
RFI的利用条件较为苛刻,需要php.ini配置文件中allow_url_fopen与allow_url_include都为on才可以。
但是远程文件包含意味着包含的文件内容是我们完全可控的,不是来自服务器端的文件,所以一旦服务器存在远程文件包含漏洞会造成的危害极大。