php伪协议
php伪协议的作用
PHP 内置了多种 流封装器(Stream Wrappers),用于处理不同的输入/输出方式。它们像“协议”一样,允许你用 协议名:// 的格式访问各种数据源。
常见的php伪协议
| 伪协议 | 作用 |
|---|---|
file:// |
访问本地文件系统(默认) |
http:// / https:// |
访问 HTTP 网络资源 |
php://input |
读取原始 POST 数据(常用于 getshell) |
php://filter |
对本地文件进行读/写时应用过滤器 |
php://stdin / php://stdout |
标准输入/输出流 |
data:// |
将 base64 或纯文本当作文件处理 |
zip:// / phar:// |
访问压缩包内的文件 |
?file=php://filter/convert.base64-encode/resource=index.php的结构
1 | php://filter/convert.base64-encode/resource=index.php |
php://filter:固定协议头。
convert.base64-encode:过滤器,告诉 PHP 在读取文件内容后,对数据进行 base64_encode() 编码。
resource=index.php:目标文件,即要读取的原始文件路径。
base64 编码的作用
如果不加过滤器,当 include 或 require 包含一个 PHP 文件时,PHP 会 直接执行该文件中的 PHP 代码,而不是返回源代码。
例如 include(‘index.php’) 会运行 index.php 里的逻辑,无法看到其中的 PHP 标签内的内容。
而 php://filter/convert.base64-encode 会把 文件原始内容(包括 标签)视为字符串,进行 base64 编码后再交给 include。
由于 base64 编码后的内容不包含 <?php 标签,PHP 不会执行它,只会输出编码后的字符串。收到该字符串后手动解码,就可以得到完整的源码。
使用场景
目标存在 include($_GET[‘page’]) 或 file_get_contents($_GET[‘file’]) 等函数。
想读取源码(而不是执行),就用 php://filter。
如果想执行任意 PHP 代码,可以用 php://input、data://、phar:// 等。
有些程序会自动拼接后缀(如 .php),php://filter 不受后缀影响(因为过滤器本身不依赖扩展名)。
例如:?file=php://filter/convert.base64-encode/resource=../../../etc/passwd 可以直接读取 /etc/passwd。
- 可以叠加多个过滤器,例如:
php://filter/convert.base64-encode|convert.base64-decode/resource=index.php
(先编码再解码,最后得到原始内容,有时用于绕过 WAF)
