一、介绍
程序开发人员通常出于灵活性的考虑,会将被包含的文件设置成变量,然后动态调用这些文件。但正是因为调用的灵活性导致用户可能调用一些恶意文件,造成文件包含漏洞。
二、分类
1)、本地文件包含:包含本地主机上的文件(Web服务器),文件名称是相对路径或者绝对路径;
2)、远程文件包含:包含互联网上的文件,文件名称为url格式;
三、相关函数
1)、include():当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行;
2)、include_once():功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次;
3)、require():使用该函数包含文件时,只要程序一执行,立即调用脚本;如果前者执行发生错误,输出错误信息,并终止脚本允许;
4)、require_once():功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次;
四、文件包含相关配置
allow_url_fopen=on 允许打开url文件
allow_url_include=on 允许应用url文件
五、复现
包含点:
<?php
include($_GET['file']);
?>
1、本地文件包含
1)、绝对路径
2)、相对路径
2、远程文件包含
3、伪协议
1)、file:// 用于访问本地文件系统,不受allow_url_fopen与allow_url_include影响
使用:file://绝对路径
2)、php://filter 用于数据流打开时筛选过滤应用,不受allow_url_fopen与allow_url_include影响
使用:php:filter参数
参数:
resource(要过滤的数据流):必须参数,指定筛选过滤的数据流;
read(读链的筛选表):可选参数,可设定一个或多个过滤器名称,以管道符(|)分隔;
write(写链的筛选列表):可选参数,可设定一个或多个过滤器名称,以管道符(|)分隔;
筛选过滤应用:
convert.base64-encode base64编码
convert.base64-decode base64解码
base64解码:
文件包含写数据:
测试脚本:
<?php
$content = $_GET['txt'];
file_put_contents($_GET['filename'],$content);
?>
将要写入的内容进行base编码
http://192.168.133.133/include.php?filename=php://filter/write=convert.base64-decode/resource=0429.php&txt=TWFzc2ltbzIwMjMwNDI5
查看文件:
3)、php://input 可以访问请求的原始数据的只读流,将post请求中的数据作为php代码执行,需要开启allow_url_include
只有Content_Type为multipart/form-data的时候,php不会将http请求数据包中的相应数据填入php://input,否则其它情况都会
4)、data:// 读取数据流且执行,自php5.2.0起有效,allow_url_fopen、allow_url_include需要都开启才能使用
用法:data://text/plain;base64,<执行代码的base64编码> | data://text/plain,<执行的代码>
http://192.168.133.133/include.php?file=data://text/plain,%3C?php%20phpinfo();?%3E
http://192.168.133.133/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg==
包含日志文件
利用条件:知道日志的物理存放路径、存在文件包含漏洞、使用bp发送请求
1)、构造url,访问web服务,目的,构成错误的请求,让apache将错误请求写入错误日志中
查看错误日志:
2)使用包含点,包含错误日志