URLDNS链分析

本文最后更新于:2024年9月4日 下午

一条简单的反序列化链

URLDNS链

ysoserial的源码开始调试,直接在Github下载其源码导入IDEA,Maven会自动加载需要的包。

直接看到URLDNS.java的文件,我们关注getObject函数里面的这两个代码,说明使用的是HashMap,并且将URL作为其中的键值对造成的反序列化问题

为了方便调试,做一下准备,首先进入URL类中,找到hashCode函数,然后点击handler.hashCode()进去,

在353行处打下断点,这也真是请求DNS解析的地方

然后回到URLDNS.java中,修改main函数为下面这样:

然后我们进行调试,可以发现会多次进入我们打断点的地方但没有发出请求,这是为什么呢,是因为ysoserial自己重写了这个地方,修改返回值为null所以无事发生。

大概3次步进,再次到我们打断点的地方,查看调用栈:

HashMap.readObject()->HashMap.hash()->URL.hashCode()->URLStreamHandler.hashCode()

于是我们查看HashMap类,我们知道Java反序列化问题的造成都是因为不安全的重写readObject函数造成的,所以搜索readObject函数

都是会先调用一个默认的readObject然后后面写自己的逻辑,

在1397行的位置,可以看到使用了putVal(hash(key), key, value, false, false);这个语句,对key进行了hash运算,我们这里的key就是URL类,在此处下断点,重新调试。

步进查看hash这个方法,它是继续调用了key.hashCode()来计算,也就是我们这里的URL.hashCode()

于是继续触发URLStreamHandler.hashCode(),最终到URLStreamHandler.getHostAddress()就发出了DNS请求。

总的来说,这条链子很简单但很重要,因为它不需要依赖其他包,仅仅使用了原生的Java包,主要是用来检测是否存在反序列化漏洞

HashMap.readObject()

->HashMap.hash()

->URL.hashCode()

->URLStreamHandler.hashCode()

->URLStreamHandler.getHostAddress()

->InetAddress.getByName()


URLDNS链分析
https://3xsh0re.github.io/2024/09/04/URLDNS链分析/
作者
3xsh0re
发布于
2024年9月4日
许可协议