目录
通过PHP函数某些特性函数利用URL动态引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,被包含的文件可以是各种文件格式,当文件中包含恶意代码,就会形成远程命令执行或文件上传漏洞。
(1)include():包含并运行指定文件。只生成警告,脚本会继续执行
(2)require():包含并运行指定文件。在出错时产生错误,脚本中止运行
(3)include_once():在脚本执行期间包含并运行制定文件。与include区别:检查是否被包含过,如果是则不会再次包含。
(4)require_once():在脚本执行期间包含并运行制定文件。与require区别:检查是否被包含过,如果是则不会再次包含。
使用前提:协议在双off的情况下也可以正常使用;
allow_url_fopen :off/on (规定是否允许从远程服务器或者网站检索数据 )
allow_url_include:off/on (规定是否允许include/require远程文件 )
1、准备一个带有文件包含漏洞的php文件和一个带有一句话木马的txt文件


2、 访问有文件包含漏洞的文件

文件包含成功。
读取源代码并进行base64编码输出,使用前提:在双off的情况下也可以正常使用;
allow_url_fopen : off/on
allow_url_include: off/on
1、查看php文件的源码


可以访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行。
allow_url_fopen : off/on
allow_url_include: on
1、使用burpsuite抓包后重放

为什么图中抓取的是GET包,我们传递的又是post参数呢?
使用方法: zip://[压缩文件绝对路径]#[压缩文件内的子文件名]
1、准备一个压缩包

2、测试
没有成功执行的原因? #号没有编码

使用方法:compress.zlib://[压缩文件绝对路径]
allow_url_fopen :on
allow_url_include:on
1、在URL栏后面直接加上一句话木马

2、可以使用base64编码绕过
| 协议 | allow_url_fopen | allow_url_include | 用法 |
| file:// | off/on | off/on | ?file=file://路径/文件名.txt |
| php://filter | off/on | off/on | ?file=php://filter/read=convert.base64-encode/resource=文件 |
| php://input | off/on | on | ?file=php://input 一句话木马 |
| zip:// | off/on | off/on | ?file=zip://压缩包路径%23压缩包子文件 |
| compress.bzip2:// | off/on | off/on | ?file=compress.bzip2://压缩包路径 |
| compress.zlib:// | off/on | off/on | ?file=compress.zlib://压缩包路径 |
| data:// | on | on | ?file=data://text/plain,一句话木马 ?file=data://text/plain,base64,被base64编码后的一句话木马 |
- "utf8">
- error_reporting(0);
- $file = $_GET["file"];
- if(stristr($file,"php://filter") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
- exit('hacker!');
- }
- if($file){
- if ($file!="http://www.baidu.com") echo "tips:flag在当前目录的某个文件中";
- include($file);
- }else{
- echo 'click go baidu';
- }
- ?>
1、使用php://input传递post流,burpsuite抓包后写入一句话木马

2、使用命令查看文件目录:dir,找到flag.txt

3、 查看flag.txt文件的内容:type

4、检查flag.txt内容,查询正确
| 命令 | 命令解释 |
| dir | 显示一个目录下的文件和子目录列表以及文件的其他详细资料,包括文件大小,创建日期和时间等。 dir [drive:驱动器名称][path目录路径] [/p] [/w] [/o] [/s] |
| copy | 将一个或多个文件复制到另一个位置。 copy [要复制的文件名] [复制到的路径或文件夹] |
| move | 用于将文件或目录从一个位置移到另一个位置。复制和移动的区别在于move命令将文件从源位置删除。 move [要移动的文件名] [文件移到的路径或文件夹] |
| md/mkdir | 新建目录 md [path表示即将创建的目录的路径] [directoryname表示所有创建的目录名称,此参数必须要有] |
| cd | 改变当前目录 cd [某个盘d: c: 等] |
| ren | 重命名文件或文件夹 ren [oldfilename旧名字] [newfilename新名字] |
| del | 用于删除目录中的文件。要删除其它驱动器或目录中的文件,则必须指定路径。 del [filename表示要删除的文件名] |
| rd/rmdir | 用于删除文件夹 rd [directoryname表示要删除的文件夹名称] |
| cls | 清除屏幕 |
| type | 显示文件内容 type 文件名.扩展名 |
| echo | 创建文件并填写内容 echo 内容>文件名.格式后缀 |
- show_source(__FILE__);
- include('flag.php');
- $a= $_GET["a"];
- if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){
- echo "success\n";
- echo $flag;
- }
1、随便上传一个a的值进行测试

2、使用抓包传值

- "utf8">
- error_reporting(0);
- $file = $_GET["file"];
- if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
- exit('hacker!');
- }
- if($file){
- include($file);
- }else{
- echo '< a href="?file=flag.php">tips a>';
- }
- ?>
对PHP伪协议有过滤,我们用php://filter获取base64编码后的内容


- "utf8">
- error_reporting(0);
- $file = $_GET["file"];
- if(stristr($file,"input")||stristr($file, "filter")||stristr($file,"data")/*||stristr($file,"phar")*/){
- echo "hack?";
- exit();
- }else{
- include($file);
- }
- ?>
1、进入upload文件

2、使用zip上传压缩包文件获得当前路径


3、取出绝对路径执行一句话木马,找到flag.txt文件
4、重新上传文件,修改txt文件内容,获取flag.txt文件内容

文件包含漏洞可以包含apache的日志文件=必须知道文件路径+文件包含漏洞
日志以天数分割,查询速度快、利于分类和保存
1、找到日志文件路径(如果日志文件太大了,可能会包含失败)

2、随便上传一个一句话木马,会被写入日志中

3、查看日志文件,一句话木马是否写入
![]()
4、可以看出写入日志的一句话木马被编码了,我们可以使用burp suite抓包后修改一句话木马


5、 访问日志绝对路径,查看是否成功包含
