phar反序列化

news2025/1/12 12:07:06

序列化和反序列化的区别?

可参考:【精选】什么是反序列化?反序列化的过程,原理-CSDN博客

通俗的说序列化将对象转化为了字符串,包含了对象的所有数据信息,
反序列化时再根据这些信息还原对象

序列化:就是将对象转化成字节序列的过程。

反序列化:就是讲字节序列转化成对象的过程。

对象序列化成的字节序列会包含对象的类型信息、对象的数据等,说白了就是包含了描述这个对象的所有信息,能根据这些信息“复刻”出一个和原来一模一样的对象。

那么为什么要去进行序列化呢?

有以下两个原因

  1. 持久化:对象是存储在JVM中的堆区的,但是如果JVM停止运行了,对象也不存在了。序列化可以将对象转化成字节序列,可以写进硬盘文件中实现持久化。在新开启的JVM中可以读取字节序列进行反序列化成对象。
  2. 网络传输:网络直接传输数据,但是无法直接传输对象,可在传输前序列化,传输完成后反序列化成对象。所以所有可在网络上传输的对象都必须是可序列化的。

什么是phar?

Phar是PHP的压缩文档,是PHP中类似于JAR的一种打包文件。它可以把多个文件存放至同一个文件中,无需解压,PHP就可以进行访问并执行内部语句。

phar扩展提供了一种将整个PHP应用程序放入.phar文件中的方法,以方便移动、安装。

.phar文件的最大特点是将几个文件组合成一个文件的便捷方式,.phar文件提供了一种将完整的PHP程序分布在一个文件中并从该文件中运行的方法

可以将phar文件类比为一个压缩文件

借用kali_Ma_笔记,渗透测试,安全-CSDN博客的解释就是

php序列化和反序列化过程

执行结果:

反序列化结果:

php的序列化将对象转化为了字符串,包含了对象的所有数据信息,
反序列化时再根据这些信息还原对象

phar文件格式:

1.stub                       //phar文件头
2.manifest                //压缩文件信息
3.contents                //压缩文件内容
4.signature               //签名

 stub:

Stub是Phar的文件标识,也可以理解为它就是Phar的文件头
这个Stub其实就是一个简单的PHP文件,它的格式具有一定的要求,具体如下

xxx<?php xxx; __HALT_COMPILER();?>

前面的内容是不限制的,可以是任意字符,包括留空

php闭合符与最后一个分号之间不能有多于一个的空格符。另外php闭合符也可省略

但在该PHP语句中,必须有 __HALT_COMPILER() ,没有这个,PHP就无法识别出它是Phar文件

manifest:

用于存放文件的属性、权限等信息。
这里也是反序列化的攻击点,因为这里以序列化的形式存储了用户自定义的 Meta-data

contents:

用于存放Phar文件的内容

signature:

位于文件末尾

签证尾部的01代表md5加密,02代表sha1加密,04代表sha256加密,08代表sha512加密

当我们修改文件的内容时,签名就会变得无效,这个时候需要更换一个新的签名

更换签名的脚本

from hashlib import sha1
with open('test.phar', 'rb') as file:
    f = file.read() 
s = f[:-28] # 获取要签名的数据
h = f[-8:] # 获取签名类型和GBMB标识
newf = s + sha1(s).digest() + h # 数据 + 签名 + (类型 + GBMB)
with open('newtest.phar', 'wb') as file:
    file.write(newf) # 写入新文件

PHP反序列化:

Phar之所以能反序列化,是因为Phar文件会以序列化的形式存储用户自定义的meta-data,PHP使用phar_parse_metadata在解析meta数据时,会调用php_var_unserialize进行反序列化操作

利用条件:

1、phar文件能够上传至服务器
//即要求存在file_get_contents()、fopen()这种函数

2、要有可利用的魔术方法
//利用魔术方法作为"跳板"

3、文件操作函数的参数可控,且:、/、phar等特殊字符没有被过滤
//一般利用姿势是上传Phar文件后通过伪协议Phar来实现反序列化,伪协议Phar格式是`Phar://`这种,如果这几个特殊字符被过滤就无法实现反序列化

4、php.ini中的phar.readonly选项,需要为Off(默认是on)。

Phar属于伪协议,伪协议使用较多的是一些文件操作函数,如fopen()copy()file_exists()等,具体如下图,也就是下面的函数如果参数可控可以造成Phar反序列化

phar的生成

需要去检查一下php.ini中的phar.readonly选项,如果是On,需要修改为Off。

还需要下列代码生成

<?php 
class test{
    public $name="qwq";
    function __destruct()
    {
        echo $this->name;
    }
}
$a = new test();
$a->name="phpinfo();";
$phartest=new phar('phartest.phar',0);//后缀名必须为phar
$phartest->startBuffering();//开始缓冲 Phar 写操作
$phartest->setMetadata($a);//自定义的meta-data存入manifest
$phartest->setStub("<?php __HALT_COMPILER();?>");//设置stub,stub是一个简单的php文件。PHP通过stub识别一个文件为PHAR文件,可以利用这点绕过文件上传检测
$phartest->addFromString("test.txt","test");//添加要压缩的文件
$phartest->stopBuffering();//停止缓冲对 Phar 归档的写入请求,并将更改保存到磁盘
?>

绕过方式:

当环境限制了phar不能出现在前面的字符里。可以使用compress.bzip2://compress.zlib://等绕过

compress.bzip://phar:///test.phar/test.txt
compress.bzip2://phar:///test.phar/test.txt
compress.zlib://phar:///home/sx/test.phar/test.txt

也可以利用其它协议

php://filter/read=convert.base64-encode/resource=phar://phar.phar

GIF格式验证可以通过在文件头部添加GIF89a绕过

1、$phar->setStub(“GIF89a”."<?php __HALT_COMPILER(); ?>"); //设置stub
2、生成一个phar.phar,修改后缀名为phar.gif

如:

更改文件格式

我们利用Phar反序列化的第一步就是需要上传Phar文件到服务器,而如果服务端存在防护,比如这种

$_FILES["file"]["type"]=="image/gif"

要求文件格式只能为gif,这个时候我们该怎么办呢?
因为PHP识别Phar文件的方式是通过Stub里的__HALT_COMPILER();来识别这个文件是Phar文件,对于其他是无限制的,也就意味着我们即使对文件后缀和文件名进行更改,其实质仍然是Phar文件。
示例代码

<?php
    class Test {
        public $name;
        function __construct(){
            echo "I am".$this->name.".";
        }
    }
    $obj = new Test();
    $obj -> name = "quan9i";
    $phar = new Phar('test.phar');
    $phar -> startBuffering(); //开始缓冲 Phar 写操作
    $phar -> setStub('GIF89a<?php __HALT_COMPILER();?>'); //设置stub,添加gif文件头
    $phar ->addFromString('test.txt','test'); //要压缩的文件
    $phar -> setMetadata($obj);  //将自定义meta-data存入manifest
    $phar -> stopBuffering(); 停止缓冲对 Phar 归档的写入请求,并将更改保存到磁盘
?>

绕过__HALT_COMPILER();检测

PHP通过__HALT_COMPILER来识别Phar文件,那么出于安全考虑,即为了防止Phar反序列化的出现,可能就会对这个进行过滤

示例代码如下

if (preg_match("/HALT_COMPILER/i",$Phar){
    die();
}

这里的话绕过思路有两个
1、将Phar文件的内容写到压缩包注释中,压缩为zip文件,示例代码如下

<?php
$a = serialize($a);
$zip = new ZipArchive();
$res = $zip->open('phar.zip',ZipArchive::CREATE); 
$zip->addFromString('flag.txt', 'flag is here');
$zip->setArchiveComment($a);
$zip->close();    
?>

2、将生成的Phar文件进行gzip压缩,压缩命令如下

gzip test.phar

压缩后同样也可以进行反序列化


相关链接见:

https://www.cnblogs.com/CoLo/p/16786627.html#:~:text=Phar%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%20Phar%E4%B9%8B%E6%89%80%E4%BB%A5%E8%83%BD%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%EF%BC%8C%E6%98%AF%E5%9B%A0%E4%B8%BAPhar%E6%96%87%E4%BB%B6%E4%BC%9A%E4%BB%A5%E5%BA%8F%E5%88%97%E5%8C%96%E7%9A%84%E5%BD%A2%E5%BC%8F%E5%AD%98%E5%82%A8%E7%94%A8%E6%88%B7%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%20meta-data%2CPHP%E4%BD%BF%E7%94%A8,phar_parse_metadata%20%E5%9C%A8%E8%A7%A3%E6%9E%90meta%E6%95%B0%E6%8D%AE%E6%97%B6%EF%BC%8C%E4%BC%9A%E8%B0%83%E7%94%A8%20php_var_unserialize%20%E8%BF%9B%E8%A1%8C%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%93%8D%E4%BD%9C%E3%80%82

phar反序列化+两道CTF例题_ctf phar反序列化_Z3eyOnd的博客-CSDN博客

https://www.cnblogs.com/CoLo/p/16786627.html#:~:text=Phar%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%20Phar%E4%B9%8B%E6%89%80%E4%BB%A5%E8%83%BD%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%EF%BC%8C%E6%98%AF%E5%9B%A0%E4%B8%BAPhar%E6%96%87%E4%BB%B6%E4%BC%9A%E4%BB%A5%E5%BA%8F%E5%88%97%E5%8C%96%E7%9A%84%E5%BD%A2%E5%BC%8F%E5%AD%98%E5%82%A8%E7%94%A8%E6%88%B7%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%20meta-data%2CPHP%E4%BD%BF%E7%94%A8,phar_parse_metadata%20%E5%9C%A8%E8%A7%A3%E6%9E%90meta%E6%95%B0%E6%8D%AE%E6%97%B6%EF%BC%8C%E4%BC%9A%E8%B0%83%E7%94%A8%20php_var_unserialize%20%E8%BF%9B%E8%A1%8C%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%93%8D%E4%BD%9C%E3%80%82

 PHP Phar反序列化浅学习 - 跳跳糖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1137407.html

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

相关文章

0026Java程序设计-中学走读生信息管理系统设计与实现

文章目录 摘要**目录**系统设计开发环境 摘要 目前&#xff0c;中学走读生信息管理系统已经发展成为学校的学生走读管理工作中必不可少的一个组成部分&#xff0c;没有该系统&#xff0c;学生的日常工作就会变得繁琐、效率低下。在信息化的社会发展下&#xff0c;有必要建立一…

Three.js 基础纹理贴图

本文简介 带尬猴&#xff0c;我嗨德育处主任 尽管 Three.js 文档已经比较详细了&#xff0c;但对于刚接触 Three.js 的工友来说&#xff0c;最麻烦的还是不懂如何组合。Three.js 的功能实在太多了&#xff0c;初学者很容易被大量的新概念冲晕。 本文主要讲解入门 Three.js 必…

BES2700 蓝牙协议之RFCOMM通道使用方法

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务 BES2700 RFCOMM通道使用方法 RFCOMM_CHANNEL_NUM 枚举定义了一系列的通道号码,并为每个通道号码指定了一个具体的名称。以下是其中一些通道的中文含义: RFCOMM_CHAN…

解决Windows出现找不到mfcm90u.dll无法打开软件程序的方法

今天&#xff0c;我非常荣幸能够在这里与大家分享关于mfc90u.dll丢失的5种解决方法。在我们日常使用电脑的过程中&#xff0c;可能会遇到一些软件或系统错误&#xff0c;其中之一就是mfc90u.dll丢失。那么&#xff0c;mfc90u.dll究竟是什么文件呢&#xff1f;接下来&#xff0c…

【代码随想录】算法训练计划02

1、977. 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 思路&#xff1a; 这题思路在于——双指针…

网工内推 | 国企,解决方案工程师,最高30k,有软考证书优先

01 中电信数智科技有限公司海南分公司 招聘岗位&#xff1a;解决方案经理&#xff08;ICT&#xff09; 职责描述&#xff1a; 1、负责调动前后端资源做好全省ICT业务的售前支撑服务工作。 2、根据实际项目需求&#xff0c;主动协同客户渠道开展ICT项目商机挖掘&#xff0c;促进…

点云处理【七】(点云配准)

点云处理 第一章 点云数据采集 1.点云配准 点云配准是将两个或多个点云数据集融合到一个统一的坐标系统中的过程。这通常是为了创建一个完整的模型或融合从不同视角采集的数据。 点云配准一般分为粗配准和精配准&#xff0c;粗配准指的是在两幅点云之间的变换完全未知的情况下…

JS加密/解密之那些不为人知的基础逻辑运算符

不多说&#xff0c;直接上干货 使用逻辑非运算符 ! 和双重逻辑非运算符 !!&#xff1a;例如 ![]、!![]、!0、!!0 和 !""、!!""。空字符串的转换&#xff1a;!"" 和 !!""。数组和对象的类型转换&#xff1a;[] []、[] - []、{} [] 和…

STM32中除零运算,为何程序不崩溃?

在 C 语言中&#xff0c;除零运算会导致异常吗&#xff1f; 在 C 语言中&#xff0c;当一个数除以零时&#xff0c;会导致除法运算错误&#xff0c;通常表现为“除以零”错误或被称为“浮点异常”&#xff08;floating-point exception&#xff09;。 对于整数除法&#xff0c…

YOLOv5源码中的参数超详细解析(3)— 训练部分(train.py)| 模型训练调参

前言:Hello大家好,我是小哥谈。YOLOv5项目代码中,train.py是用于模型训练的代码,是YOLOv5中最为核心的代码之一,而代码中的训练参数则是核心中的核心,只有学会了各种训练参数的真正含义,才能使用YOLOv5进行最基本的训练。🌈 前期回顾: YOLOv5源码中的参数超详细解析…

IC-705连接wfview

wfview是一款开源的主要针对ICOM的远程控制软件&#xff0c;可以通过USB或者无线控制电台&#xff0c;貌似还支持X6100。 IC-705支持WLAN功能&#xff0c;连接wfview非常方便。 IC-705的WLAN支持两种模式&#xff0c;一种是Station模式&#xff0c;可用于连接WI-FI路由器&#…

vue中使用xlsx插件导出多sheet excel实现方法

安装xlsx&#xff0c;一定要注意版本&#xff1a; npm i xlsx0.17.0 -S package.json&#xff1a; {"name": "hello-world","version": "0.1.0","private": true,"scripts": {"serve": "vue-c…

Fabric.js 图案笔刷

本文简介 带尬猴&#xff0c;我是德育处主任 Fabric.js 有图案画笔功能&#xff0c;这个功能可以简单理解成“刮刮卡”效果。 如果只是看 Fabric.js 文档可能还不太明白 图案画笔 PatternBrush 是如何使用。 本文将讲解如何配置这款画笔的基础属性。 图案画笔&#xff08;笔…

UG\NX二次开发 连接曲线、连结曲线 UF_CURVE_auto_join_curves

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介 UG\NX二次开发 连接曲线、连结曲线 UF_CURVE_auto_join_curves 效果 代码 #include "me.hpp" extern DllExport void ufusr(char* param, int* returnC…

TypeScript之索引签名

1. 索引签名 在 TypeScript 中&#xff0c;索引签名是一种定义对象类型的方式&#xff0c;它允许我们使用字符串或数字作为索引来访问对象的属性。 索引签名最主要的作用就是允许我们动态地添加或访问对象的属性&#xff0c;通过使用索引签名&#xff0c;我们可以在编译时无法…

2023年CSP-S赛后总结(2023CSP-S题解+游记)

目录 T1 题目描述 输入格式 输出格式 代码 T2 题目描述 输入格式 输出格式 题目描述 输入格式 输出格式 题意翻译 代码 T3 题目背景 题目描述 输入格式 输出格式 代码 T4 题目描述 输入格式 输出格式 代码 总结 游记 DAY1 DAY0 DAY-1 T1 题目描述…

P-MOS管开关机控制电路(手动按键控制和自动采样信号触发控制)

1. 手动(按键)控制 这种控制适合与消费电子&#xff0c;家庭消费电子领域&#xff0c;用户人为地手动按动机械按键控制P-MOS管导通与断开。例如&#xff1a;电动牙刷、儿童玩具等等&#xff0c;很多都会用到一个按钮控制产品的开关机&#xff0c;调档等等。 1.1 RH6030_JX触摸…

029.Python面向对象_类补充_属性(方法)相关

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

Qt之菜单栏、工具栏、状态栏介绍及工具栏QAction的动态增删显示实现方式

目的 端应用程序或者编辑器基本都支持工具栏快捷功能的动态增删&#xff0c;即通过在菜单栏上打钩就可以在工具栏上看到相应功能的快捷按钮&#xff0c;取消打钩则在工具栏上就移除了该功能的快捷按钮。那么Qt如何实现这个功能&#xff0c;本篇目的就是记录实现此功能的方法及思…

cmd 命令关闭占用端口

工作中还是偶尔会遇到端口号被占用的情况&#xff0c;之前也有写过另一种关闭方式&#xff0c;但是发现没有命令方便&#xff0c;所以记录一下。 1、 查看 8081 端口占用的 pid 。 命令&#xff1a;netstat -ano |findstr 8081 由上图可知&#xff0c;占用 8081 端口的进程 id…