攻防世界-file_include
file_includephp://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)
对文件内容做检查(如检测 ),导致无法看到源码内容(仅显示执行结果)。?filename=php://filter/convert.base64-encode/resource=flag.php#使用 convert.base64-encode#将 flag.php 的内容转换为 Base64 编码字符串(非执行),从而绕过 PHP 解析,直接输出编码后的源码。convert.iconv.utf8.utf16 → 让文件内容变成 UTF-16,可能绕过某些正则检测
convert.base64-encode → 让文件变成 Base64,避免直接显示 PHP 代码#使用 convert.iconv.utf8.utf16#将文件内容从 UTF-8 编码转换为 UTF-16,导致以下效果:/*1.破坏 PHP 标签结构:原始的 UTF-8 字节序列被转换后,无法被 PHP 识别为合法标签,从而阻止代码执行。例如:,转换后会显示为乱码,但敏感信息(如 FLAG{xxx})仍可被识别。php支持的字符编码
绕过WAF/黑名单
直接访问 flag.php 被拦截,但 php://filter 可能未被检测。
convert.iconv.utf8.utf16 → 让文件内容变成 UTF-16,可能绕过某些正则检测
convert.base64-encode → 让文件变成 Base64,避免直接显示 PHP 代码详解php://filter以及死亡绕过
php://filter的各种过滤器
wp
?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})仍可被识别。发现有过滤,提示“do not hack!" 猜测是黑名单检测敏感字符串
抓包字符集爆破
?filename=php://filter/convert.iconv.utf8.utf16/resource=flag.php?filename=php://filter/convert.base64/resource=flag.php
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]