java审计-反序列化
readObject/writeObject
java在序列化一个对象时,将会调用这个对象中的writeobject方法,参数类型是objectOutputStream,开发者可以将任何内容写入这个stream中,反序列化时,会调用readObject,开发者也可以从中读取出前面写入的内容,并进行处理
ysoserial-URLDNS
gadget chains:利用链
URLDNS是ysoserial中一个利用链的名字,其结果是一次DNS请求
作用
- 使用java内置的类构造,对第三方库没有依赖
- 在目标没有回显的时候,能够通过DNS请求得知是否存在反序列化漏洞
利用链分析
触发反序列化的方法是readObject
,为了研究ysoserial中的这个利用链,我们从payload入手,其中写到
public class URLDNS implements ObjectPayload<Object>{ |
可以发现,在getObject中返回的被反序列化的对象是HashMap,因此接下来就是在这里打个断点,跟一下其过程
如何使用ysoserial项目进行调试
打开工程,然后针对缺少的依赖,可以直接点击+号进行添加
接下来看一下pom.xml可以发现主类是
ysoserial.GeneratePayload |
接下来到这个主类这里进行分析,然后右键点击开始debug,在上面设置一下参数
可以发现已经跑起来了,并且在断点这里停下了
分析
URLDNS的getObject为反序列化的起点,所以来这里进行分析,发现其调用了HasMap(),并且这边注释到会链接到URL
在hashmap函数中,我们首先看看反序列化方法readObject(),而其中比较特殊的点就在这里,在前面所说
The Java URL class has an interesting property on its equals and |
因此我们继续跟进这个函数
可以发现,在hash函数调用了hashcode的方法,并且此时传入我们一开始设定的url
再往下,可以发现这里的handler是指向一个url类的(一开始我在这里下断点,但是初始化debug的时候,也会经过这里,而那个只是在寻找jar包,所以这里的key的属性就不同了,导致后面的handler指向的函数也不同,有很多同名函数)
而此时的handler就会指向URLStreamHandler的hashCode方法,在这个hashcode方法中可以发现调用了getHostAddress
继续跟进,可以发现调用了getByName
InetAddress.getByName(host) 的作⽤是根据主机名,获取其IP地址,在⽹络上其实就是⼀次DNS查询。 |
总结
这次的Gadget流程如下:
1.HashMap->readObject()
2.HashMap->hash()
3.URL->hashCode()
4.URLStreamHandler->hashCode()
5.URLStreamHandler->getHostAddress()
6.InetAddress->getByName()
poc
知道整条利用链以后,就要学习一下如何编写反序列化exp了,后面再来补坑
java审计-反序列化