这是ysoserial的URLDNS链

首先选择HashMap,这里首先满足了继承Serializable

再寻找source,找到重写的readObject

Key 与 Value 的值执行了<font style="color:rgb(51, 51, 51);">readObject</font>的操作,再将 Key 和 Value 两个变量扔进<font style="color:rgb(51, 51, 51);">hash</font>这个方法里,我们再跟进(ctrl+鼠标左键即可) hash 当中

如果传入的key不为null,则进入hashCode方法,跟进hashCode方法
是Object类的方法,满足调用常见的函数
原理

URL是hashMap的put方法产生的

put调用hash方法,参数为key

这里再调用key的hashCode方法
HashMap到URL共有的hashCode方法,从而链接到一起
|
|
跟进URL,因为key.hashCode(),key又是new URL,所以这里会调用URL的hashCode方法

发现是handler调用了hashCode方法,继续跟进

跟进到URLStreamHandler类,寻找hashCode方法

InetAddress addr = getHostAddress(u);对u进行了操作,跟进
getHostAddress

这里就是对域名解析,然后可以检测DNS是否查询来判断反序列化漏洞
利用
|
|
运行序列化后,发现触发了DNS查询

跟进URL的hashCode的


hashCode一开始就是-1,所以会直接执行handler.hashCode从而触发DNS查询,这样会混淆是否是反序列化的时候触发
所以需要再序列化的时候将hashCode的值改为不是-1的值
因为hashCode是私有属性,需要通过反射来修改
|
|
通过反射修改后就不会出现上面的情况了