PHP phar:协议对象注入技术介绍
字数 1177 2025-08-18 11:37:33
PHP phar协议对象注入技术详解
一、技术背景
在BlackHat 2018大会上,Secarma的安全研究员Sam Thomas公布了一种针对PHP应用程序的新型攻击技术,该技术可以在不使用PHP unserialize()函数的情况下实现PHP对象注入漏洞,进而可能导致远程代码执行。
二、PHP文件操作协议
PHP文件操作允许使用多种URL样式协议访问文件路径,常见的包括:
data://zlib://php://
这些协议通常用于远程文件包含(RFI)攻击,例如:
include($_GET['file']);
include('php://filter/convert.base64-encode/resource=index.php');
include('data://text/plain;base64,cGhwaW5mbygpCg==');
三、phar协议的特殊性
phar://协议相比其他协议有一个独特之处:Phar(PHP Archive)文件包含序列化格式的元数据。
Phar文件结构
Phar文件包含三部分:
- stub - Phar文件的引导部分
- 文件内容
- 序列化的元数据
四、创建包含恶意元数据的Phar文件
以下是创建包含恶意元数据的Phar文件的示例代码:
// 创建新的Phar文件
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); ?>');
// 添加任意类的对象作为元数据
class AnyClass {}
$object = new AnyClass;
$object->data = 'rips';
$phar->setMetadata($object);
$phar->stopBuffering();
生成的Phar文件中,对象会以序列化字符串的形式存储。
五、对象注入原理
当通过phar://协议对Phar文件执行文件操作时,其序列化元数据会被自动反序列化。这意味着:
- 元数据中注入的对象会被加载到应用程序的作用域中
- 如果应用程序中存在同名类(
AnyClass)且定义了魔术方法__destruct()或__wakeup(),这些方法会被自动调用
示例:
class AnyClass {
function __destruct() {
echo $this->data;
}
}
// 输出: rips
include('phar://test.phar');
六、攻击利用条件
要成功利用此漏洞,需要满足以下条件:
-
Phar文件上传:攻击者需要能够在目标服务器上植入Phar文件
- 技巧:可以将Phar文件隐藏到JPG等常见文件中
- 常见上传点:图片上传功能
-
可控文件路径:应用程序中存在未经验证的文件操作函数调用,且攻击者可以控制完整文件路径
七、易受攻击的函数
以下看似无害的文件操作函数都可能成为攻击入口:
file_exists($_GET['file']);
md5_file($_GET['file']);
filemtime($_GET['file']);
filesize($_GET['file']);
八、漏洞影响
通过此技术可以实现:
- 任意对象注入
- 魔术方法自动调用
- 可能导致远程代码执行(RCE)
- 其他依赖对象注入的漏洞利用
九、防御措施
- 输入验证:对所有文件操作函数的输入进行严格验证
- 禁用phar流:在php.ini中禁用phar流(如果不需要)
; Disable phar:// wrapper allow_url_include=0 - 文件上传限制:严格限制上传文件类型,验证文件内容而不仅是扩展名
- 使用最新PHP版本:新版本PHP对phar反序列化有更多安全限制
- 代码审计:使用工具如RIPS检测潜在漏洞
十、检测方法
自动化检测应关注:
- 用户输入是否在PHP文件操作中未经验证
- 文件路径是否完全或部分由攻击者控制
- 是否存在可被利用的
phar://注入点
十一、总结
phar://协议的对象注入技术为PHP应用程序安全带来了新的挑战,它绕过了传统的反序列化防御,通过常规文件操作函数实现对象注入。开发人员和安全研究人员需要关注这一新型攻击面,采取适当的防御措施。