php伪协议
字数 1265 2025-08-20 18:17:58

PHP伪协议详解与安全实践

1. PHP伪协议概述

PHP内置了多种URL风格的封装协议,可以与文件系统函数(如fopen()copy()file_exists()filesize()等)配合使用。这些协议提供了灵活的文件访问方式,但也可能带来安全风险。

2. 常见PHP伪协议详解

2.1 file://协议

定义:用于访问本地文件系统

特点

  • 不受allow_url_fopenallow_url_include配置影响
  • 如果文件包含PHP代码会被执行

使用方法

file://文件的绝对路径

示例

include('file:///var/www/html/config.php');

2.2 php://协议

2.2.1 php://filter/

用途:读取文件源码

特点

  • 需要对PHP代码文件进行编码输出,否则会被执行
  • 适用于allow_url_fopenallow_url_include任何配置

基本payload

php://filter/read=convert.base64-encode/resource=file

payload解析

  • php://filter/:PHP流封装器,提供数据过滤功能
  • read=convert.base64-encode/:指定base64编码过滤器
  • resource=file:指定要操作的文件

过滤器变种

php://filter/convert.iconv.a.b/resource=check.php

其中a、b为编码格式,如:

php://filter/convert.iconv.UTF-7.UCS-4*/resource=check.php
php://filter/read=string.rot13/resource=imposible.php

复杂过滤器示例

php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|convert.iconv.UTF8.UTF7|...|convert.base64-decode/resource=php://temp

2.2.2 php://input

用途:访问请求原始数据流,执行POST数据中的PHP代码

利用条件

  • allow_url_include必须为on
  • allow_url_fopen任意

利用方法

?file=php://input

POST数据:

<?php phpinfo();?>

注意事项

  • 需要使用原始POST请求(如Burp Suite)
  • URL编码可能导致执行失败

2.3 zip://协议

用途:访问压缩包内文件

特点

  • 需要绝对路径
  • #号需URL编码为%23
  • 压缩包后缀可任意

payload格式

zip://[压缩包绝对路径]%23[压缩包内文件]

示例

?file=zip://D:\1.zip%23phpinfo.txt

类似协议

  • zlib://
  • bzip2://

2.4 data://协议

用途:直接处理数据流

利用条件

  • allow_url_fopen必须为on
  • allow_url_include必须为on

基本payload

data://text/plain,<?php phpinfo();?>

base64编码payload

data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

绕过示例

data://text/plain;base64,c3VjY2Vzcw==  // 'success'的base64编码

注意事项

  • base64编码前的PHP代码不能包含分号
  • 特殊字符需正确处理

3. 防御措施

  1. 输入过滤

    • 使用str_replace等方法过滤危险字符
    • 实现白名单限制
  2. 配置加固

    • 设置open_basedir限制文件访问范围
    • allow_url_includeallow_url_fopen设为最小权限
  3. 文件管理

    • 对上传文件重命名(如使用伪随机数)
    • 及时升级PHP版本,防止%00截断等漏洞
  4. 代码审查

    • 检查所有文件操作函数的使用
    • 验证用户输入是否直接用于文件操作

4. 总结

PHP伪协议提供了强大的文件操作能力,但也带来了严重的安全隐患。安全人员应充分了解这些协议的工作原理和利用方式,以便在开发中实施有效的防御措施。同时,定期进行安全审计和配置检查是确保系统安全的重要环节。

PHP伪协议详解与安全实践 1. PHP伪协议概述 PHP内置了多种URL风格的封装协议,可以与文件系统函数(如 fopen() 、 copy() 、 file_exists() 和 filesize() 等)配合使用。这些协议提供了灵活的文件访问方式,但也可能带来安全风险。 2. 常见PHP伪协议详解 2.1 file://协议 定义 :用于访问本地文件系统 特点 : 不受 allow_url_fopen 和 allow_url_include 配置影响 如果文件包含PHP代码会被执行 使用方法 : 示例 : 2.2 php://协议 2.2.1 php://filter/ 用途 :读取文件源码 特点 : 需要对PHP代码文件进行编码输出,否则会被执行 适用于 allow_url_fopen 和 allow_url_include 任何配置 基本payload : payload解析 : php://filter/ :PHP流封装器,提供数据过滤功能 read=convert.base64-encode/ :指定base64编码过滤器 resource=file :指定要操作的文件 过滤器变种 : 其中a、b为编码格式,如: 复杂过滤器示例 : 2.2.2 php://input 用途 :访问请求原始数据流,执行POST数据中的PHP代码 利用条件 : allow_url_include 必须为on allow_url_fopen 任意 利用方法 : POST数据: 注意事项 : 需要使用原始POST请求(如Burp Suite) URL编码可能导致执行失败 2.3 zip://协议 用途 :访问压缩包内文件 特点 : 需要绝对路径 #号需URL编码为%23 压缩包后缀可任意 payload格式 : 示例 : 类似协议 : zlib:// bzip2:// 2.4 data://协议 用途 :直接处理数据流 利用条件 : allow_url_fopen 必须为on allow_url_include 必须为on 基本payload : base64编码payload : 绕过示例 : 注意事项 : base64编码前的PHP代码不能包含分号 特殊字符需正确处理 3. 防御措施 输入过滤 : 使用 str_replace 等方法过滤危险字符 实现白名单限制 配置加固 : 设置 open_basedir 限制文件访问范围 将 allow_url_include 和 allow_url_fopen 设为最小权限 文件管理 : 对上传文件重命名(如使用伪随机数) 及时升级PHP版本,防止%00截断等漏洞 代码审查 : 检查所有文件操作函数的使用 验证用户输入是否直接用于文件操作 4. 总结 PHP伪协议提供了强大的文件操作能力,但也带来了严重的安全隐患。安全人员应充分了解这些协议的工作原理和利用方式,以便在开发中实施有效的防御措施。同时,定期进行安全审计和配置检查是确保系统安全的重要环节。