PHP 8.0中伪协议是绕过限制的关键杠杆,通过流封装器机制接管文件读取逻辑,php://filter可不受allow_url_fopen影响实现稳定源码读取。

PHP 8.0 中,伪协议在文件包含漏洞利用中不是“功能增强”,而是“绕过限制的关键杠杆”。它不依赖新语法,而是延续 PHP 流封装器(stream wrapper)机制,在 include、require 等函数解析可控参数时,接管文件读取逻辑,把原本要打开的磁盘路径,替换成内存流、编码转换链或原始请求体——从而绕过后缀检查、内容过滤和路径限制。
php://filter:LFI 场景下最稳的源码读取方式
PHP 8.0 仍默认启用 php://filter,且不受 allow_url_fopen 和 allow_url_include 影响。它本质是“流过滤器”,对目标文件内容做即时转换,而非执行。
- 读取 PHP 源码时,用
convert.base64-encode把含<?php的代码转成 Base64 字符串,避免被解析执行,也绕过关键词检测 - 典型 payload:
?file=php://filter/convert.base64-encode/resource=index.php,响应是 base64 编码后的源码,解码即可查看 - 当目标过滤了
php://关键字,可尝试大小写混合(PhP://)、双写(phpphp://)、URL 编码(php%3a%2f%2f)等绕过手法
php://input:POST 体即代码,需条件配合
该协议读取原始请求体(raw POST data),在文件包含点支持 php://input 且 allow_url_include=On 时,可直接执行传入的 PHP 代码。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 适用场景:GET 参数被严格过滤,但
include($_GET['file'])未校验协议,且服务端未禁用allow_url_include - 操作方式:发 POST 请求,URL 带
?file=php://input,Body 写入<?php phpinfo();?> - 注意:若 Content-Type 是
multipart/form-data,php://input为空,此时不可用
file:// 与 data://:基础但受限的替代选择
file:// 在 PHP 8.0 中依然无需任何配置即可读取本地文件,但常被 open_basedir 或路径截断(../)限制;data:// 可嵌入代码,但要求 allow_url_include=On(PHP 8.0 默认 Off)。
立即学习“PHP免费学习笔记(深入)”;
-
file://更适合读取日志、配置、环境变量等无 PHP 标签的文本文件,例如:?file=file:///etc/passwd -
data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+可直接执行 base64 解码后的代码,但现代生产环境基本禁用 - PHP 8.0 加强了对危险协议的警告日志,虽不阻止运行,但会记录到 error_log,红队需注意隐蔽性
绕过思路在 PHP 8.0 下更需关注上下文
PHP 8.0 对类型声明、错误报告更严格,但伪协议底层机制未变。真正影响利用的是运行时配置与代码逻辑。
- 先确认是否触发 LFI:尝试
?file=../../etc/passwd看是否报错或返回内容,判断路径是否可达 - 再测协议可用性:依次尝试
php://filter、php://input,观察是否被 WAF 或自定义过滤器拦截 - 若
convert.base64-encode返回空或乱码,可能是文件不存在、路径错误,或被open_basedir截断,需结合ini_get('open_basedir')探测范围


















