当前位置: 首页 > news >正文

php中的phar反序列化基础

参考php反序列化拓展攻击详解--phar-先知社区]

什么是phar?

phar类似Java中的jar,将整个php应用程序打包到一个文件里面。
用户可以直接通过php test.phar执行一个php项目

phar本质上是一个包含多个文件的压缩包,里面存储着有特殊的数据。
开发者可以把phar一整个项目打包成一个phar文件,用户下载这一个文件就可以执行整个项目
image.png

phar文件的结构

大体来说 Phar 结构由4部分组成
image.png

1.stub:phar 文件标识

<?php
Phar::mapPhar();
include 'phar://phar.phar/index.php';
__HALT_COMPILER();
?>
  • 这是一个 合法的 PHP 脚本片段,必须以 <?php 开头,并以 __HALT_COMPILER(); ?> 结尾。
  • 当你直接运行 php app.phar 时,PHP 解释器会执行这个 stub。
  • 它通常用于设置自动加载、引导应用入口等。
    简单来说可以把他理解为一个标志
    格式为xxx<?php xxx; __HALT_COMPILER();?>,前面内容不限,但必须以__HALT_COMPILER();?>来结尾,否则phar扩展将无法识别这个文件为phar文件。

2. Manifest(清单 / 元数据)

  • 一个二进制或序列化的结构,记录了归档中每个文件的:
    • 文件路径(在 phar 内部的虚拟路径)
    • 偏移量(在文件中的位置)
    • 大小
    • 压缩方式(none / gzip / bzip2)
    • 权限(如 0644)
    • 时间戳
    • 是否为目录
  • 还可能包含全局元数据(通过 setMetadata() 设置)。

这部分由 Phar 扩展自动管理,开发者通常无需手动操作。

3. File Contents(文件内容区)

  • 所有被添加到 Phar 中的实际文件内容(按顺序或按压缩方式存储)。
  • 每个文件可以独立选择是否压缩(Gzip 或 Bzip2)。
  • 在 PHP 中可通过 phar:// 流访问,例如:
file_get_contents('phar://myapp.phar/config/app.php');

4. Signature(签名,可选)

  • 位于文件末尾(但在 __HALT_COMPILER(); 之后?不,实际在 __HALT_COMPILER(); 之前的数据之后)。
  • 用于验证 Phar 文件是否被篡改。
    这个没啥好讲的,一般不是考点

生成一个phar文件

注意:要将php.ini中的phar.readonly选项设置为Off,否则无法生成phar文件。

<?phpclass TestObject {}$phar = new Phar("phar.phar"); //后缀名必须为phar$phar->startBuffering();//开启 Phar 的缓冲写入模式。操作暂存内存中$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub$o = new TestObject();$phar->setMetadata($o); //将自定义的meta-data存入manifest$phar->addFromString("test.txt", "test"); //在 Phar 归档内部创建一个名为test.txt的虚拟文件,内容为字符串 "test"。//签名自动计算$phar->stopBuffering();//将内存中数据写入磁盘
?>

我们可以在phpstorm里面看到phar文件展开的格式
image.png

phar文件中的meta-data是以序列化的形式储存的
image.png

当 PHP 访问 phar://... 流时(如 file_exists('phar://a.phar')),会自动反序列化 manifest 中的 metadata
metadata里面序列化后的数据:
image.png

触发反序列化的函数

有序列化数据必然会有反序列化操作,php一大部分的文件系统函数在通过phar://伪协议解析phar文件时,都会将meta-data进行反序列化,测试后受影响的函数如下:
image.png

这里我们来演示一下phar触发反序列化
生成phar的php:

<?php  
phpinfo();  
class TestObject {  public function __destruct() {  echo $this->data;  echo 'Destruct called';  }  
}  @unlink("phar.phar");  $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();  
?>

读取phar的php:

<?php  
class TestObject {  public function __destruct() {  echo $this->data;  echo 'Destruct called';  }  
}  
include('phar://phar.phar/test.txt');

运行第一个生成phar文件
然后运行第二个php
image.png
可以看到成功触发了反序列化
Bzip / Gzip协议和phar://一样可以触发反序列化

$filename = 'compress.zlib://phar://phar.phar/test.txt';

利用phar进行rce

利用条件
1.phar文件要能够上传到服务器端。
2.如file_exists(),fopen(),file_get_contents(),file()等文件操作的函数要有可用的魔术方法作为"跳板"。
3.文件操作函数的参数可控,且::、/、phar等特殊字符没有被过滤。

看几个例题

待补充.....

http://www.gsyq.cn/news/60777.html

相关文章:

  • AT_arc083_d [ARC083F] Collecting Balls 笔记
  • 数据采集第三次作业-102302128吴建良
  • 102302116_田自豪_作业3
  • 畅通工程 最小生成树
  • Oracle数据库物理备份与恢复实战指南
  • 实用指南:Kafka面试精讲 Day 30:Kafka面试真题解析与答题技巧
  • 有用的包 #Python
  • 2025 人事管理工具选型:不同方案优劣势测评,中小企业闭眼抄作业
  • 2025年大众途观L更换轮胎推荐:五大专业品牌最新推荐
  • 树上背包优化
  • 2025年11月十大效果图公司推荐榜单:用户口碑评价与性能参数对比
  • 2025年11月十大效果图公司推荐榜单:专业分析与权威评测对比
  • 2025 年 11 月高壓清洗服務廠家推薦排行榜,管道/下水道/污水管/市政管道高壓清洗,化糞池/隔油池/污水池專業清洗,家庭/商鋪/小區/工廠高效深度清潔首選!
  • 如何在C++中实现面向对象编程?
  • 最简单的畅通工程
  • 唯物辩证法3大观点11原理
  • 加盟稳赚?2025广东自习室加盟TOP5品牌及盈利方案
  • AI写论文方法全揭秘:轻松掌握高效论文写作技巧
  • 2025年11月最新出炉!南京装修公司推荐首推欧阅恒装 TOP5权威榜单
  • Hash求无向图的桥
  • 完整教程:【2025最全】国内AIPPT工具排行榜
  • 关于powershell中的-哈希表-Hashtable-类型-说明-类似于python中的字典
  • CSP-S2025 T4 员工招聘 题解
  • 2025 GEO优化公司排名权威榜单解读:浙江四家标杆企业凭何突围?
  • 写给0-1岁的初创公司合伙人(101):天使轮与种子轮融资的条件解锁机制
  • Mac Unity 2018.dmg游戏工具 安装步骤 简单易懂教程(附安装包)
  • 102302147傅乐宜作业3
  • 2025中小学生AI学习机选购核心:5大品牌实测,提分才是硬通货!
  • 深入解析:DNS解析原理及工作流程详解
  • 6000 AI Program Topic 3~6