在ysoserial工具中的部分源码如下:
URLStreamHandler handler = new SilentURLStreamHandler(); HashMap ht = new HashMap(); URL u = new URL(null, url, handler); ht.put(u, url); Reflections.setFieldValue(u, "hashCode", -1);
分析
在生成payload后进行反序列化时会调用HashMap的readObject()
方法:
在调用readObject方法时会对key值计算Hash,然后传入putVal()
方法中,然后进入hash()
方法:
在这里会调用URL类的hashCode()
方法:
在URL类的hashCode()
方法中如果hashCode
值为-1则会调用handler.hashCode(this)
计算hash值,然后会进入URLStreamHandler
类的hashCode()
方法:
它取出URL类的协议、主机名、文件等信息并分别计算hashCode
并加在一起,在获取主机名时会最终调用到URL类的getHostAddress()
方法:
然后调用InetAddress.getByName()
方法根据主机名获取IP地址,在这里会进行一次DNS查询。
整个调用过程如下:
* Gadget Chain: * HashMap.readObject() * HashMap.putVal() * HashMap.hash() * URL.hashCode()