一、文件包含漏洞
解释:文件包含漏洞是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行;其还能够使得服务器上的源代码被读取,在PHP里面我们把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程叫做包含
1.PHP常用文件包含函数
- require():找不到被包含的文件会产生致命错误,并停止脚本运行
- include():找不到被包含的文件只会产生警告,脚本继续执行
- require_once()与require()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
- include_once()与include()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
2.文件包含之任意文件转为PHP执行
解释:在php里面include函数,在执行的时候,如果可以将被包含文件里面的内容当做php代码执行,也就是说,比如include包含了一个png文件,但是里面写的都是php代码,这个php就会被执行,这样很容易造成一句话木马的上传
例如:
解释:从上图文件可知道,page对应include加载的文件,a文件内容如下,其并非php后缀文件但是却被当作php执行了
<?php
echo 'odwadawdwak';
?>
3.远程文件包含
解释:当php配置项allow_url_include、allow_url_fopen状态为ON的话,则include/require函数是可以加载远程文件,远程文件->其它服务器上的php文件,这种设置如果代码存在文件包含漏洞可能会造成致命的威胁
4.伪协议
解释:PHP内置了很多伪协议,其可能会造成任意文件读取,执行任意命令等问题
文章在此:二、PHP伪协议
5.目录穿越
解释:因为include对内容的解析问题,存在该漏洞,包括在window上面有类似但不同的情况(如下图),下面例子cd
到一个不存在的目录,但是都没有报错,因为cd去解析后面的../
了,其实就相当于,先cd
到一个不存在的目录,然后../
又切换回上级一级目录了,这种情况可能就会导致攻击能够绕过一些正则进行目录穿越来暴力访问文件
<?php
include 'dwadawdaw?/../a.php';
?>
上面的例子相当于先cd 进入了dwadawdaw?这个目录发现其不存在,然后执行../a.php,翻译过来相当于include 'a.php';
include 'dwadawdaw?/../../a.php'; 等价于include '../a.php';