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
2
3
4
php://filter/convert.base64-encode/resource=index.php
│ │ │
└─主协议 └─过滤器 └─目标资源(要读取的文件)

  1. php://filter:固定协议头。

  2. convert.base64-encode:过滤器,告诉 PHP 在读取文件内容后,对数据进行 base64_encode() 编码。

  3. 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 不会执行它,只会输出编码后的字符串。收到该字符串后手动解码,就可以得到完整的源码。

使用场景

  1. 本地文件包含(LFI)漏洞的利用

  • 目标存在 include($_GET[‘page’]) 或 file_get_contents($_GET[‘file’]) 等函数。

  • 想读取源码(而不是执行),就用 php://filter。

  • 如果想执行任意 PHP 代码,可以用 php://input、data://、phar:// 等。

  1. 绕过文件扩展名限制

  • 有些程序会自动拼接后缀(如 .php),php://filter 不受后缀影响(因为过滤器本身不依赖扩展名)。

  • 例如:?file=php://filter/convert.base64-encode/resource=../../../etc/passwd 可以直接读取 /etc/passwd。

  1. 多过滤器链式处理

  • 可以叠加多个过滤器,例如:
    php://filter/convert.base64-encode|convert.base64-decode/resource=index.php
    (先编码再解码,最后得到原始内容,有时用于绕过 WAF)