这是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是私有属性,需要通过反射来修改
|
|
通过反射修改后就不会出现上面的情况了