2.URLDNS¶
故事的开始从 URLDNS 开启,因为是最简单最容易理解的反序列化虽然这个 “利用链” 实际上是不能利用”的,但因为其不存在第三方依赖,⾮常适合我们在检测反序列化漏洞时使用
看看利用流程
@Author:Y4tacker * Gadget Chain: * HashMap.readObject() * HashMap.putVal() * HashMap.hash() * URL.hashCode()
下面是 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);
那么我们首先直奔 HashMap 的 readObject 方法, 首先获取传入的 key 与 val,后面可以看到将 HashMap 的键名计算了 hash
继续跟入,调用了 URL 类的 hashcode 方法,因为这个 key 是⼀个 java.net.URL 对象
handler 是 URLStreamHandler 对象的某个子类对象,这里是使用 SilentURLStreamHandler
之后调用了 getHostAddress
这里 InetAddress.getByName(host) 就进行了一次 DNS 查询
这里也能看到效果