php中的phar反序列化基础

news/2025/11/25 22:02:23/文章来源:https://www.cnblogs.com/rycarl/p/19269987

参考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.mzph.cn/news/976516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

干扰素:定义、类型与科研应用全解析

在生命科学研究的武器库中,干扰素作为一类关键的核心科研试剂,始终占据着举足轻重的地位。它是机体抵御病毒入侵的首道防线,更是连接先天免疫与适应性免疫的重要桥梁。对于从事病毒学、免疫学、肿瘤学及药物开发的研…

AT_arc083_d [ARC083F] Collecting Balls 笔记

模拟赛 #46 T3。 分析一下,如果有一个机器人对应的一条直线都没有球捡,那就不可能捡完,输出 \(0\),好像没有其他不合法的情况了。 一个球和 \((x,y)\) 有关,按照二分图的套路我们令 \(x\to y+n\) 连无向边,若最终…

Spring IOC 源码学习一 基本姿势

Spring IOC 源码学习一 基本姿势 以下是个人私货, 请读者谨慎参考。 作为一个过来人, 没有方式方法学习 Spring 源码枯燥无味的,建议你:熟悉常见的Spring关键接口:Spring 框架庞大而复杂,扩展点非常多,建议先了解…

可持久化01trie板子

int rt[M]; int cnt[M<<5]; int ch[M<<5][2]; int pre[M]; int tot=0; int n,m; void ins(int a,int b,int t,int x){if(t<0)return;int i = (x>>t)&1;ch[a][!i]=ch[b][!i];ch[a][i]=++tot;c…

2025年11月25日

2025年11月25日 一.滑动窗口专题:class Solution { public:vector<int> findAnagrams(string s, string p) {vector<int> ans; // 记录满足条件的起点。//异位词就是不考虑字母顺序,所以只需要统计每个字…

数据采集第三次作业-102302128吴建良

《数据采集与融合》第三次作业 学号: 102302128姓名: 吴建良 Gitee仓库地址: (请在这里填写您的Gitee仓库链接) 作业①:多线程爬取网站图片 一、核心思路与代码MiniCrawler (爬虫核心类)MiniCrawler 类封装了爬虫的…

2025年操控的轮胎推荐:最新性能轮胎深度解析报告

2025年操控的轮胎推荐:最新性能轮胎深度解析报告为解决用户在“操控的轮胎推荐”上的选择难题,本文将基于全球主流汽车媒体(如《AutoBild》、汽车之家等)的公开评测模型与数据,从以下四大核心维度,对市场上的主流…

2025年节油的轮胎推荐:官方TOP10低滚阻榜单揭秘

2025年节油的轮胎推荐:官方TOP10低滚阻榜单揭秘在消费者日益关注用车成本的当下,“节油的轮胎推荐”正成为各大汽车论坛与专业评测机构的热议焦点。面对琳琅满目的轮胎产品,用户亟需一套基于真实数据、覆盖多维性能…

实用指南:云计算学习(三)——子网划分

实用指南:云计算学习(三)——子网划分pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

基于 Vue3 及TypeScript 项目后的总结 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

慢就是快 用在生活中

假设现在手里有三个活:写报告,回邮件,做表格 求快:报告写个开头,弹出邮箱就回两句,表格填一行数据 求稳: 1、减法 : 哪个是当前的核心,先搞哪个 2、专注 : 回邮箱就回邮箱,写报告就写报告,做表格就做表格,…

102302116_田自豪_作业3

作业1: 要求:指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(http://www.weather.com.cn)。实现单线程和多线程的方式爬取。 –务必控制总页数(学号尾数2位)、总下载的图片数量(尾数后3位)等…

解码HTTP

HTTP 协议基础 HTTP(超文本传输协议)是应用层的请求 - 响应协议,通常运行在 TCP 之上,专门用于客户端与服务器之间的通信。浏览器访问网站、调用 API 接口等网络行为,本质都是通过 HTTP 协议实现的。超文本的核心…

计你太美

计(数)你太美!背背 计(数)你太美!背背 计(数)你式子屎太美!背背 计(数)你太美!背背 迎面走来的你让我如此蠢蠢欲动 这种感觉我从未有 Cause I got a crush on you who you 你是我的我是你的谁 再多一眼看一…

畅通工程 最小生成树

贪心权重,几个优化点注意以下 1.提前退出的优化 我们的auto会遍历未初始化的部分 2.排序排的是边不是n(点) 又是看似正确实则错误的地方 #include <bits/stdc++.h> using namespace std; struct node {int u,v,…

Oracle数据库物理备份与恢复实战指南

Oracle数据库物理备份与恢复实战指南1. RMAN基础概念 1.1 什么是RMAN RMAN(Recovery Manager)是Oracle 8i以后DBA的重要工具,位于$ORACLE_HOME/bin目录下,主要用于备份、还原和恢复操作。RMAN组成:可执行文件:rm…

实用指南:Kafka面试精讲 Day 30:Kafka面试真题解析与答题技巧

实用指南:Kafka面试精讲 Day 30:Kafka面试真题解析与答题技巧2025-11-25 21:23 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impo…

2025年比亚迪汉更换轮胎推荐:专业TOP5排名权威发布

2025年比亚迪汉更换轮胎推荐:专业TOP5排名权威发布为解决用户在“比亚迪汉更换轮胎推荐”上的选择难题,本文将基于全球主流汽车媒体(如《AutoBild》、汽车之家等)的公开评测模型与数据,从以下四大核心维度,对市场…

2025年大众帕萨特更换轮胎推荐:官方权威指南深度解析

2025年大众帕萨特更换轮胎推荐:官方权威指南深度解析在消费升级与精细化养车理念并行的新时代,越来越多的车主不再满足于“能用就行”的轮胎更换逻辑,尤其对于像大众帕萨特这样兼具德系操控质感与商务舒适定位的B级…

2025-11-25 ZYZ28-NOIP模拟赛-Round9 hetao1733837的record

2025-11-25 ZYZ28-NOIP模拟赛-Round9 hetao1733837的record2025-11-25 ZYZ28-NOIP模拟赛-Round9 hetao1733837的record 比赛链接:ZYZ28-NOIP模拟赛-Round9 A.colorful 提交链接:09-A 题面 题目描述 小 Z 最近收到了一…