URLDNS是ysoserial中的一个利用链, 这里学习的是P牛的简化版链子.
这条链子基于Java内置的类即可构造, 但是也仅仅可以用于触发DNSlog,所以比较适合用来探测反序列化漏洞是否存在.
URL Class
这条链的主角是URL Class和HashMap Class. 先看URL Class:
它的hashCode方法:
会调用URLStreamHandler.hashCode方法:
而URLStreamHandler#HashCode又调用了getHostAddress方法, 这个函数的功能就像它的名字显示的这样, 获取一个主机的IP地址, 也就是会进行一次DNS查询:
HashMap
那么现在就只需要一个Class的readObject方法可以调用URL#hashCode即可, 然后就要看一下在反序列化中非常常见的HashMap类:
在其readObject方法中有如下的一段代码:
hash(key) -> key.hashcode()
payload
调用链梳理:
HashMap#readObject-> URL#hashCode-> URLStreamHandler#hashCode-> URLStreamHandler#getHostAddress-> InetAddress#getByName(url)
package test.com;import java.io.IOException;import java.net.URL;import java.util.HashMap;public class UrlDnsChain {public static byte[] Payload(String url) throws IOException {HashMap map = new HashMap();URL u = new URL("", url, null);map.put(u,1);return Serializer.Serialize(map);}}
思考
- 为什么hashMap会调用key的hashCode?
- 为什么URL的hashCode会调用URLStreamHandler#getHostAddress?
