Ysoserial-URLDNS

分析下Ysoserial中的Payload,首先从最简单的URLDNS开始。相关的文件在ysoserial/payloads/URLDNS.java中。注释中可以找到链的调用过程

1
2
3
4
5
*   Gadget Chain:
* HashMap.readObject()
* HashMap.putVal()
* HashMap.hash()
* URL.hashCode()

主要分析该工具getObject函数返回的对象在返回之前到底做了哪些事情

image-20201129170300783

这里返回的类是HashMap,因此在反序列化时一定会调用HashMap的readObject函数

image-20201129190503940

使用ysoserial生成payload,手工反序列化触发并调试

image-20201129190549169

跟进putVal

image-20201129190612692

跟进hash(key)

image-20201129191751731

进入key.hashCode()

image-20201129191736940

这里有个技巧是,在生成序列化数据的时候,ysoserial设置了hashCode的值为-1,这样能够保证URL的Hash不被缓存,从而每次都被触发,继续跟进到getHostAddress中

image-20201129192045929

在这里会触发DNS请求

image-20201129192208556

在DNSLOG中可以看到相应的记录

image-20201129192648255

这条链总体很清楚,而且只借助JDK自身的类就能够完成,可以用来探测反序列化行为是否存在