【Web】浅浅地聊Hessian反序列化有诸多限制的原因

目录

前言

CC6的失效——LazyMap之殇

Rome-TemplatesImpl链的失效——transient之殇

结语


前文:【Web】浅聊Java反序列化之玩转Hessian反序列化的前置知识

【Web】浅聊Hessian反序列化之打Rome出网&不出网

前言

注意到很多 Java 原生反序列化利用链在 Hessian 中无法使用,甚至 ysoserial 中一些明明是 hashCode/equals/compareTo 触发的链子都不能直接拿来用。这是为什么呢?本文将以下面两个例子以点带面,浅提一下。

CC6的失效——LazyMap之殇

Hessian反序列化Map类型的对象的时候,会自动调用其put方法,而put方法又会牵引出各种相关利用链打法。map.put对于HashMap会触发key.hashCode()。

利用到hashCode的链子有很多,如CC6和Rome相关链,上篇文章我们讲了Rome相关链的利用,但并没有介绍CC6的Hessian改链,并非不想,而是不可,现在我们来详细介绍下为何CC6不能配合Hessian反序列化来打

我们来跟进反序列化一个LazyMap的全过程

先是调用HessianInput#readObject

再switchcase进到77调用_serializerFactory.readMap

跟进_serializerFactory.readMap,getDeserializer去取LazyMap的deserializer

跟进,cl 是 Map 类或其子类,则创建一个 MapDeserializer 对象 作为deserializer 并使用传入的 cl 类型来初始化它

我们跟进MapDeserialzier的初始化方法,

 

发现根据传入的type(org.apache.commons.collections.map.LazyMap)取到的Constructor数组为空,进而走到最后的判断,使this._ctor为HashMap的Constructor(构造函数),问题也就在这里出现了!即是说LazyMap被当成HashMap来恢复了,自然也就打不了CC6

我主观推测,Hessian的MapDeserialzier怎么可能知道第三方库那些各种map的构造方法,而面对未知,最后都统一成jdk原生的HashMap的构造方法才更合理,也就是说第三方库里实现了Map接口的类应该都存在这个问题

OK说回来,取到初始化后的MapDeserializer作为deserializer,再调用了readMap方法

我们跟进MapDeserializer#readMap

发现用HashMap的Constructor创建的map并非LazyMap,而是HashMap,到此破案。

 

Rome-TemplatesImpl链的失效——transient之殇

对于Rome,不出网的情况最简单粗暴应该是TemplatesImpl链,但在上文中我们却使用了SignedObject来打二次反序列化中转,显然,直接打TemplatesImpl链是有问题的。

问题何在?

因为TemplatesImpl类中被transient修饰的_tfactory属性无法被序列化,进而导致TemplatesImpl类无法初始化(TemplatesImpl那条链的defineTransletClasses要求_tfactory不为空,否则抛出异常)

可若是这样,transient是无差别的,那原生序列化不也一样无法写入_tfactory属性吗?


莫急,我们注意到TemplatesImpl重写了原生readObject方法,在readObject中给_tfactory进行赋值,而Hessian中序列化和反序列化中都不会处理transient修饰的字段

病症也就在这了。

结语

Hessian不是原生反序列化,不能从传统反序列化角度带入思考


http://www.niftyadmin.cn/n/5423097.html

相关文章

bypass Bitdefender

前言 渗透时,可能会遇到各种各样的的杀软,但每个杀软特性不同,在绕过前,往往都需要分析,本文就Bitdefender进行分析 最近在研究如何免杀,写了一个马,火绒 360 成功绕过(图有点少,当时没存,火绒测试是用的同学的物理机,两台,还有一台没截图;360是虚拟机) 然后看到Askar大佬的文…

python学习28

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…

AIGC笔记--Maya提取和修改FBX动作文件

目录 1--Maya数据解析 2--FBX SDK导出6D数据 3--6D数据映射和Maya可视化 完整项目代码:Data-Processing/FBX_SDK_Maya 1--Maya数据解析 在软件Maya中直接拖入FBX文件,可以播放和查看人体各个骨骼关节点的数据: 对于上图来说,…

零技术门槛!手机无人直播系统让你轻松上手~

在如今这个信息爆炸的时代,人们对于各种新鲜事物总是充满了好奇和期待。无人直播系统作为近年来新兴的技术产品,受到了越来越多人的关注和青睐。由于其简便易用、零技术门槛的特点,使得无人直播系统成为了很多人追捧的对象。尤其是手机无人直…

【开源】SpringBoot框架开发新能源电池回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

力扣--深度优先算法/回溯算法90.子集Ⅱ

思路分析&#xff1a; 成员变量&#xff1a; result: 用于存储最终的子集结果。path: 用于存储当前正在构建的子集。 DFS函数&#xff1a; dfs(vector<int>& nums, int start): 递归地生成子集。 从给定的start索引开始遍历数组。如果当前元素与前一个元素相同&#…

新书速览|机器学习实战:视频教学版

掌握线性回归、分类、数据降维、聚类、关联规则、协同过滤算法及应用 本书内容 《机器学习实战&#xff1a;视频教学版》基于Python语言详细讲解机器学习算法及其应用&#xff0c;用于读者快速入门机器学习。本书配套示例源代码、PPT课件、教学视频、教学大纲、习题与答案、作者…

数据库中的数据

从数据库查到的数据&#xff0c;是这种JSON格式,建和值都是双引号包裹 [[{id: 21,name: why,password: e10adc3949ba59abbe56e057f20f883e,createAt: 2024-03-11T06:55:35.000Z,updateAt: 2024-03-11T06:55:35.000Z}],[id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,name VARCH…