文章目录
- 写在前面
- 分析(以URLDNS为例)
- 分析LinkedHashSet,HashSet,TreeSet等类为什么不可以
写在前面
这篇文章的灵感来自纯好奇大佬的文章
当然推荐大家看看大佬的文章,学点骚操作,我只是顺便分析一下为什么这样可以而已,大佬可乐嗯觉得这些比较简单没有写原因,那我来学习学习顺便记录,大佬文章直达
Java反序列化数据绕WAF之加大量脏数据
分析(以URLDNS为例)
首先我们要知道ObjectInputStream的readObject的调用栈,来个网图自己懒的画,很简单的关系
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_html](https://file.cfanz.cn/uploads/png/2022/10/26/18/M302R8HL52.png)
至于为什么URLDNS,便于我更好的进行跟踪操作,仅此而已
首先看看函数调用栈,看关键的
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_java_02](https://file.cfanz.cn/uploads/png/2022/10/26/18/962JI3f94O.png)
首先是去触发readObject方法
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_html_03](https://file.cfanz.cn/uploads/png/2022/10/26/18/NY7T66829U.png)
这个s根据地址来看769那就是和上面图对应部分的输入流
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_java_04](https://file.cfanz.cn/uploads/png/2022/10/26/18/CMR0326UVd.png)
那么我想要知道ObjectInputStream都干了些什么,将文件流传入BlockDataInputStream
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_初始化_05](https://file.cfanz.cn/uploads/png/2022/10/26/18/Pe205f9eCd.png)
再传入
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_java_06](https://file.cfanz.cn/uploads/png/2022/10/26/18/AJP1R0bd00.png)
前面这一部分没啥分析的意义,就是一些初始化读取属性过程
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_调用栈_07](https://file.cfanz.cn/uploads/png/2022/10/26/18/C94dI7FfP4.png)
我这里直接跳过垃圾数据那阶段了,反正都是一样的道理跟入
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_调用栈_08](https://file.cfanz.cn/uploads/png/2022/10/26/18/dRRfbG8946.png)
继续跟入
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_初始化_09](https://file.cfanz.cn/uploads/png/2022/10/26/18/96VcfB02Cc.png)
这里根据数据流类型进入对应分支
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_自动驾驶_10](https://file.cfanz.cn/uploads/png/2022/10/26/18/fXX28Q1BC1.png)
看这里似乎是对流执行了序列化
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_java_11](https://file.cfanz.cn/uploads/png/2022/10/26/18/34X29II9M7.png)
跟进
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_自动驾驶_12](https://file.cfanz.cn/uploads/png/2022/10/26/18/51O5G11535.png)
跟进
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_自动驾驶_13](https://file.cfanz.cn/uploads/png/2022/10/26/18/WN03I80C7W.png)
跟进lookupObject
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_html_14](https://file.cfanz.cn/uploads/png/2022/10/26/18/1BWGT6301G.png)
查找并返回与给定句柄相关的对象
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_java_15](https://file.cfanz.cn/uploads/png/2022/10/26/18/16W78K755H.png)
实例化
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_html_16](https://file.cfanz.cn/uploads/png/2022/10/26/18/XeM25Z6NM6.png)
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_调用栈_17](https://file.cfanz.cn/uploads/png/2022/10/26/18/cI087NY62Z.png)
很明显了到这里
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_java_18](https://file.cfanz.cn/uploads/png/2022/10/26/18/2L8C797O8A.png)
后面就是到URLDNS链子了,没必要了
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_java_19](https://file.cfanz.cn/uploads/png/2022/10/26/18/A0E98283f8.png)
分析LinkedHashSet,HashSet,TreeSet等类为什么不可以
文章里面师傅说的有点小错误,不是所有的例子都不可以,这里以URLDNS的HashSet为例,可以看到这里因为Hashcode不为-1被返回了
![,可以 [Java安全]HashMap的readObject都发生了什么_自动驾驶_20](https://file.cfanz.cn/uploads/png/2022/10/26/18/fPb8f97G90.png)
去找一下hashcode咋来的
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_自动驾驶_21](https://file.cfanz.cn/uploads/png/2022/10/26/18/fb8ZP1NZEY.png)
可以看见重点是primVals
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_初始化_22](https://file.cfanz.cn/uploads/png/2022/10/26/18/S6e95We1P7.png)
好奇这个哪来的吗,跟入URL的readFields
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_html_23](https://file.cfanz.cn/uploads/png/2022/10/26/18/d389E3EcK7.png)
跟入
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_java_24](https://file.cfanz.cn/uploads/png/2022/10/26/18/3M58f076CL.png)
这里进行了简单的初始化,下面过程比较枯燥
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_初始化_25](https://file.cfanz.cn/uploads/png/2022/10/26/18/b42O2Yd1Ib.png)
接下来到readFields
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_html_26](https://file.cfanz.cn/uploads/png/2022/10/26/18/2HM9VfbJHb.png)
跟进
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_自动驾驶_27](https://file.cfanz.cn/uploads/png/2022/10/26/18/dWA4PC7bHa.png)
继续跟进
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_html_28](https://file.cfanz.cn/uploads/png/2022/10/26/18/EM11eAa8Ib.png)
再往下跟进
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_调用栈_29](https://file.cfanz.cn/uploads/png/2022/10/26/18/4IF08Y37a5.png)
继续往下跟进
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_html_30](https://file.cfanz.cn/uploads/png/2022/10/26/18/4Z6K5B23a8.png)
可以看到最终调用了readBytes是个native方法,没办法往下跟进的
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_html_31](https://file.cfanz.cn/uploads/png/2022/10/26/18/5M9fBN067W.png)
![在这里插入图片描述 [Java安全]HashMap的readObject都发生了什么_初始化_32](https://file.cfanz.cn/uploads/png/2022/10/26/18/M6Af8d64Ad.png)
具体原因就出这里了,有兴趣的大佬可以试试分析Java底层C实现这个方法










