文件包含(精讲)
1. 文件包含基础
1.1 简介
在⼀个PHP脚本中,去将另外⼀个⽂件包含进来,去合作完成⼀件事情。
1.2 作用
⽂件包含可以更好的提⾼代码的重⽤性,引⼊⽂件包含函数,可以通过⽂件包含函数将⽂件包含进来,直接使⽤包含⽂件的代码。
1.3 文件包含函数
include:找不到被包含的⽂件时只会产⽣警告,但是不会终⽌程序的运⾏,程序会继续运⾏
include_once:与include函数的作⽤相同,但是⽂件被include_once函数包含过⼀次之后,将不会再被包含
require:找不到被包含的⽂件时会终⽌程序的运⾏,同时也会产⽣告警
require_once:与require函数的作⽤相同,但是⽂件只会被包含⼀次
1.4 案例
Include.php:
<?php
include('1.php');
echo '<br>';
include('1.php');
?>
Include_once:
<?php
header('Conten-type:text/html;character=utf-8');
include_once('1.php');
echo '<br>';
include_once('1.php');
echo '<br>';
echo "This is second include!!!";
?>
Require.php:
<?php
require('1.php');
echo '<br>';
echo 'report error';
require('2.php');
?>
Require_once.php:
<?php
require_once('1.php');
echo '<br>';
echo 'This is second include!!!';
require_once('1.php');
?>
2. 文件包含漏洞基础
2.1 成因
程序开发⼈员⼀般希望代码更灵活,所以将被包含的⽂件设置为变量,⽤来进⾏动态调⽤,⽂件包含函数加载的参数没有经过过滤或者严格的定义,可以被⽤户控制,包含其他恶意⽂件,导致了执⾏了⾮预期的代码。从⽽导致客户端可以调⽤⼀个恶意⽂件,造成⽂件包含漏洞。
2.2 危害
读取⽂件
远程⽂件读取实现⽹站挂⻢
包含⽇志⽂件getshell
利⽤php://input伪协议可以执⾏任意脚本代码(即时没有⽂件上传也能执⾏脚本代码)
配合⽂件上传漏洞getshell
2.3 利用
2.3.1 本地文件包含
代码:
<?php
include $_GET['a'];
?>
2.3.2 远程文件包含
需要将allow_url_include改为On状态
地址栏输入:http://192.168.187.129/zzyinclude/test1.php/?a=http://192.168.187.129/include.php
2.4 特点
2.4.1无视文件扩展名
在PHP中当使⽤上⾯的⼀些函数的时候,这个⽂件就会被当作PHP代码进⾏执⾏,PHP内核并不会在意包含的⽂件是什么类型的,也就是说当发过来的是.png的⽂件也会被当作PHP执⾏。
2.4.2 无条件解析php代码
在文件中如果有符合php代码规范时,会无条件执行。
3. 文件包含漏洞综合利用
3.1 伪协议利用
3.1.1 常见伪协议
php://filter 是⼀种元封装器,设计⽤于数据流打开时的筛选过滤应⽤
data:// 同样类似与php://input,可以让⽤户来控制输⼊流
php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执⾏
phar://xxx.png/shell.php 解压缩的⼀个函数,不管后缀是什么,都会当作压缩包来解压。
zip://会将所有格式的⽂件按照压缩⽂件的格式进⾏处理
3.1.2 php://filter利用
地址栏输入:
http://192.168.187.129/zzyinclude/test1.php/?a=php://filter/convert.base64-encode/resource=C:/phpstudy_pro/www/include.php
3.1.3 php://input利用
使用lfi靶场,在原先的GET请求体中间加一条php://input,并在请求包的最下方写入<?php phpinfo();?>
3.1.4 data://
利用:data://text/plain,php代码
地址栏后附上:data://text/plain,<?php phpinfo();?>
3.1.5 zip://
地址栏输入:zip://C:/phpstudy_pro/www/1.zip%231.txt
4.绕过
4.1 关于空字符绕过之魔术引号
空字符绕过是存在PHP⼩于5.3.4版本的⼀个漏洞,这个漏洞就是⽤于接收来⾃路径中的空字符,这样在部分需求下攻击者可以利⽤将此字符放置安全⽂件后⾯来绕过访问限制。
前提条件就是需要PHP版本⼩于5.3.4,并且关闭PHP魔术引号 。
在php.ini中将magic_quote_gpc改为off状态
之后地址栏访问:http://192.168.187.129/include.php?name=C:/phpstudy_pro/www/phpinfo.php%00
4.2 其他绕过方式
00截断,但是PHP版本必须⼩于5.3
⻓路径:利⽤系统特性绕过waf。windowx系统中,当点号数量⼤于256个字符时,256个字符以后的内容就会被丢弃,
因此可利⽤此特性进⾏绕过;Liunx系统中点号⼤于4096个。
路径双写绕过:…/./…/./
后缀处添加斜杠点号进⾏绕过:info.php/.
?绕过:phpinfo.php?
绕过:直接使⽤并不能绕过,需要输⼊编码%23才能够⽣效。phpinfo.php%23
5. 防御
5.1 过滤
对传⼊的⽂件名进⾏过滤
对敏感路径的关键字进⾏过滤
5.2 php.ini配置文件设置
allow_url_fopen=off #表示本地⽂件包含
allow_url_include=off #表示远程⽂件包含
开启魔术引号magic_quotes_qpc=on
5.3 对包含文件的范围做限制
后台定义被包含⽂件的⽩名单
配置open_basedir=指定⽬录,限制访问区域
修改Apache⽇志⽂件的存放地址