Java / Web / 反序列化 · 2022年2月21日 0

URLDNS链分析

URLDNS链是ysoserial中的一条比较简单的Java反序列化利用链,这条链不依赖第三方库,也对JDK版本没有要求,可用于Java反序列化漏洞的检测。

在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()方法:

image-20220221170504868

在调用readObject方法时会对key值计算Hash,然后传入putVal()方法中,然后进入hash()方法:

image-20220221170531891

在这里会调用URL类的hashCode()方法:

image-20220221170554843

在URL类的hashCode()方法中如果hashCode值为-1则会调用handler.hashCode(this)计算hash值,然后会进入URLStreamHandler类的hashCode()方法:

image-20220221170700275

它取出URL类的协议、主机名、文件等信息并分别计算hashCode并加在一起,在获取主机名时会最终调用到URL类的getHostAddress()方法:

image-20220221170831817

然后调用InetAddress.getByName()方法根据主机名获取IP地址,在这里会进行一次DNS查询。

整个调用过程如下:

*   Gadget Chain:
*     HashMap.readObject()
*       HashMap.putVal()
*         HashMap.hash()
*           URL.hashCode()