PHP伪协议原理与常见用法详解
本文旨在解释PHP中各类伪协议(如php://input、php://filter、zip://、data://和phar://)的基本原理与典型应用。内容涵盖协议的功能特性、依赖的PHP配置项、具体使用语法以及结合文件包含函数的利用方式,旨在提供清晰的技术参考。
常见PHP伪协议解析
第1步:理解 php://input
php://input 是一个只读的数据流,允许通过 HTTP POST 请求访问原始数据。当 enctype 设置为 multipart/form-data 时,该协议无效;但在 application/x-www-form-urlencoded 等格式下可有效获取 POST 请求体内容。
要正常使用此协议,通常要求 PHP 配置文件 php.ini 中的 allow_url_include 设置为 On。
验证方法
假设存在如下代码片段:
<?php
@include($_GET["file"]);
?>
可通过向服务器发送包含目标代码的 POST 数据,并指定文件参数为 php://input 来触发执行。
第2步:掌握 php://filter
php://filter 是一种元封装器,用于在文件操作(如 readfile()、file_get_contents() 等)读取前对数据进行筛选或转换。常用于读取敏感文件的源代码而避免执行,通常配合编码过滤器(如 base64-encode)使用。
基本语法结构如下:
read=<读链筛选列表>:指定过滤操作,例如convert.base64-encode。resource=<目标文件路径>:指定要处理的资源。
常用示例:
-php://filter/read=convert.base64-encode/resource=index.php
-php://filter/resource=index.php
实践案例
若目标代码为:
<?php
$a = ($_GET["file"]);
echo file_get_contents($a);
?>
传入包含编码参数的 php://filter URL 即可输出经过 Base64 编码的文件内容,防止直接执行代码。
第3步:利用压缩流 (zip://, bzip2://, zlib://)
这组协议用于解析压缩包内的特定文件。以 zip:// 为例,它可以直接读取 ZIP 文件内部的单个文件。需注意,必须是具体的文件被压缩进 ZIP(而非整个文件夹),且 ZIP 文件路径必须为绝对路径。
语法结构通常为:协议 + ## + 绝对路径至压缩包 + # + 内部文件名。
相关变体包括:
- zip://绝对路径/xxx.zip#内部文件
- compress.bzip2://...#...(针对 .bz2 文件)
- compress.zlib://...#...(针对 .gz 文件)
实战演示
若有代码包含外部文件:
<?php
$a = ($_GET["file"]);
include($a);
?>
将恶意代码保存为文本后压缩为 xx.zip,构造类似 zip://绝对路径/xx.zip#payload.php 的 URL 即可调用内部 PHP 脚本。
第4步:内联数据流 data://
data:// 协议允许直接在 URI 中嵌入数据。与 php://input 相比,它更灵活,支持文本类型或直接提供 Base64 编码的数据块。
前置条件:需在 php.ini 中将 allow_url_include 和 allow_url_fopen 均设为 On。
常见使用形式:
- data://text/plain,<?php ... ?>
- data://text/plain;base64,<base64编码字符串>
测试用例
结合文件包含函数:
<?php
$a = ($_GET["file"]);
include($a);
?>
构造 URL 指向 data:// 并附带有效 Payload 即可实现远程逻辑执行。
第5步:探索 phar:// 协议
phar:// 专门用于解析 PHP 归档文件。由于其内部同样兼容 ZIP 结构的存储规则,故在解析某些旧版打包内容时具备特殊能力。该协议在处理对象反序列化时表现尤为突出。
标准路径格式:phar://绝对路径/to/file.phar/内部目标文件.ext
以上就是关于PHP中各主流伪协议基本原理与应用方式的详细内容,更多关于PHP安全特性及相关漏洞防范的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













