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文件包含三部分:

  1. stub - Phar文件的引导部分
  2. 文件内容
  3. 序列化的元数据

四、创建包含恶意元数据的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文件执行文件操作时,其序列化元数据会被自动反序列化。这意味着:

  1. 元数据中注入的对象会被加载到应用程序的作用域中
  2. 如果应用程序中存在同名类(AnyClass)且定义了魔术方法__destruct()__wakeup(),这些方法会被自动调用

示例:

class AnyClass {
    function __destruct() {
        echo $this->data;
    }
}
// 输出: rips
include('phar://test.phar');

六、攻击利用条件

要成功利用此漏洞,需要满足以下条件:

  1. Phar文件上传:攻击者需要能够在目标服务器上植入Phar文件

    • 技巧:可以将Phar文件隐藏到JPG等常见文件中
    • 常见上传点:图片上传功能
  2. 可控文件路径:应用程序中存在未经验证的文件操作函数调用,且攻击者可以控制完整文件路径

七、易受攻击的函数

以下看似无害的文件操作函数都可能成为攻击入口:

file_exists($_GET['file']);
md5_file($_GET['file']);
filemtime($_GET['file']);
filesize($_GET['file']);

八、漏洞影响

通过此技术可以实现:

  1. 任意对象注入
  2. 魔术方法自动调用
  3. 可能导致远程代码执行(RCE)
  4. 其他依赖对象注入的漏洞利用

九、防御措施

  1. 输入验证:对所有文件操作函数的输入进行严格验证
  2. 禁用phar流:在php.ini中禁用phar流(如果不需要)
    ; Disable phar:// wrapper
    allow_url_include=0
    
  3. 文件上传限制:严格限制上传文件类型,验证文件内容而不仅是扩展名
  4. 使用最新PHP版本:新版本PHP对phar反序列化有更多安全限制
  5. 代码审计:使用工具如RIPS检测潜在漏洞

十、检测方法

自动化检测应关注:

  1. 用户输入是否在PHP文件操作中未经验证
  2. 文件路径是否完全或部分由攻击者控制
  3. 是否存在可被利用的phar://注入点

十一、总结

phar://协议的对象注入技术为PHP应用程序安全带来了新的挑战,它绕过了传统的反序列化防御,通过常规文件操作函数实现对象注入。开发人员和安全研究人员需要关注这一新型攻击面,采取适当的防御措施。

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