[Java安全]HashMap的readObject都发生了什么

2024-01-19 14:48

本文主要是介绍[Java安全]HashMap的readObject都发生了什么,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 写在前面
  • 分析(以URLDNS为例)
  • 分析LinkedHashSet,HashSet,TreeSet等类为什么不可以

写在前面

这篇文章的灵感来自纯好奇大佬的文章
当然推荐大家看看大佬的文章,学点骚操作,我只是顺便分析一下为什么这样可以而已,大佬可乐嗯觉得这些比较简单没有写原因,那我来学习学习顺便记录,大佬文章直达
Java反序列化数据绕WAF之加大量脏数据

分析(以URLDNS为例)

首先我们要知道ObjectInputStream的readObject的调用栈,来个网图自己懒的画,很简单的关系
在这里插入图片描述

至于为什么URLDNS,便于我更好的进行跟踪操作,仅此而已
首先看看函数调用栈,看关键的
在这里插入图片描述

首先是去触发readObject方法
在这里插入图片描述
这个s根据地址来看769那就是和上面图对应部分的输入流
在这里插入图片描述
那么我想要知道ObjectInputStream都干了些什么,将文件流传入BlockDataInputStream

在这里插入图片描述
再传入
在这里插入图片描述

前面这一部分没啥分析的意义,就是一些初始化读取属性过程
在这里插入图片描述
我这里直接跳过垃圾数据那阶段了,反正都是一样的道理

跟入
在这里插入图片描述
继续跟入
在这里插入图片描述
这里根据数据流类型进入对应分支
在这里插入图片描述
看这里似乎是对流执行了序列化
在这里插入图片描述
跟进

在这里插入图片描述
跟进
在这里插入图片描述
跟进lookupObject
在这里插入图片描述
查找并返回与给定句柄相关的对象
在这里插入图片描述
实例化
在这里插入图片描述

在这里插入图片描述
很明显了到这里
在这里插入图片描述

后面就是到URLDNS链子了,没必要了
在这里插入图片描述

分析LinkedHashSet,HashSet,TreeSet等类为什么不可以

文章里面师傅说的有点小错误,不是所有的例子都不可以,这里以URLDNS的HashSet为例,可以看到这里因为Hashcode不为-1被返回了

,可以
去找一下hashcode咋来的
在这里插入图片描述
可以看见重点是primVals
在这里插入图片描述

好奇这个哪来的吗,跟入URL的readFields
在这里插入图片描述
跟入
在这里插入图片描述
这里进行了简单的初始化,下面过程比较枯燥
在这里插入图片描述
接下来到readFields
在这里插入图片描述
跟进
在这里插入图片描述
继续跟进
在这里插入图片描述
再往下跟进
在这里插入图片描述
继续往下跟进
在这里插入图片描述

可以看到最终调用了readBytes是个native方法,没办法往下跟进的
在这里插入图片描述
在这里插入图片描述
具体原因就出这里了,有兴趣的大佬可以试试分析Java底层C实现这个方法

这篇关于[Java安全]HashMap的readObject都发生了什么的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/622767

相关文章

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

Spring三级缓存解决循环依赖的解析过程

《Spring三级缓存解决循环依赖的解析过程》:本文主要介绍Spring三级缓存解决循环依赖的解析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、循环依赖场景二、三级缓存定义三、解决流程(以ServiceA和ServiceB为例)四、关键机制详解五、设计约

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException: org.junit.Test问题

《解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException:org.junit.Test问题》:本文主要介绍解决tomcat启动时报Junit相... 目录tomcat启动时报Junit相关错误Java.lang.ClassNotFoundException

Gradle下如何搭建SpringCloud分布式环境

《Gradle下如何搭建SpringCloud分布式环境》:本文主要介绍Gradle下如何搭建SpringCloud分布式环境问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Gradle下搭建SpringCloud分布式环境1.idea配置好gradle2.创建一个空的gr

JVM垃圾回收机制之GC解读

《JVM垃圾回收机制之GC解读》:本文主要介绍JVM垃圾回收机制之GC,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、死亡对象的判断算法1.1 引用计数算法1.2 可达性分析算法二、垃圾回收算法2.1 标记-清除算法2.2 复制算法2.3 标记-整理算法2.4

springboot集成Lucene的详细指南

《springboot集成Lucene的详细指南》这篇文章主要为大家详细介绍了springboot集成Lucene的详细指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起... 目录添加依赖创建配置类创建实体类创建索引服务类创建搜索服务类创建控制器类使用示例以下是 Spring

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run

Java根据IP地址实现归属地获取

《Java根据IP地址实现归属地获取》Ip2region是一个离线IP地址定位库和IP定位数据管理框架,这篇文章主要为大家详细介绍了Java如何使用Ip2region实现根据IP地址获取归属地,感兴趣... 目录一、使用Ip2region离线获取1、Ip2region简介2、导包3、下编程载xdb文件4、J

浅析如何使用xstream实现javaBean与xml互转

《浅析如何使用xstream实现javaBean与xml互转》XStream是一个用于将Java对象与XML之间进行转换的库,它非常简单易用,下面将详细介绍如何使用XStream实现JavaBean与... 目录1. 引入依赖2. 定义 JavaBean3. JavaBean 转 XML4. XML 转 J