java hashmap 实现 序列化_通过HashMap触发DNS检测Java反序列化漏洞

本文探讨了如何通过HashMap在Java反序列化过程中利用URLStreamHandler的hashCode方法触发DNS查询,以此作为检测服务器是否易受反序列化攻击的手段。在HashMap的readObject方法中,Key的hashCode方法被调用,而URL类的hashCode方法会执行DNS查询。通过反射设置URL对象的hashCode为-1,可以确保每次反序列化时都会触发DNS查找。测试代码展示了如何构造触发DNS查询的序列化对象。
摘要由CSDN通过智能技术生成

我们常说的反序列化漏洞一般是指readObject()方法处触发的漏洞,而除此以外针对不同的序列化格式又会产生不同的出发点,比如说fastjson会自动运行setter,getter方法。之后又有各种RMI,JNDI姿势去执行命令。现在常见的黑盒检测Java反序列化方式就是执行命令API,比如用一个gadget去执行nslookup xxx 最终通过服务器记录去判断。

但这种方式可能出现的一种问题是,你选择测试的gadget服务器正好没这个jar包或者更新过了,但却有另一个存在漏洞的jar包。这时候单一的gadget构造出的执行命令payload就会漏报。所以为了解决这种问题这里分享一个通过HashMap结合URL触发DNS检查的思路。在实际过程中可以首先通过这个去判断服务器是否使用了readObject()以及能否执行。之后再用各种gadget去尝试试RCE。

HashMap readObject & URLStreamHandler hashCode

HashMap最早出现在JDK 1.2中,底层基于散列算法实现。而正是因为在HashMap中,Entry的存放位置是根据Key的Hash值来计算,然后存放到数组中的。所以对于同一个Key,在不同的JVM实现中计算得出的Hash值可能是不同的。因此,HashMap实现了自己的writeObject和readObject方法。

因为是研究反序列化问题,所以我们来看一下它的readObject方法

e5a81bd3e2d7a528fbd06576aef25cbb.png

前面主要是使用的一些防止数据不一致的方法,我们可以忽视。主要看putVal时候key进入了hash方法,跟进看

static final int hash(Object key) {

int h;

return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

}

1

2

3

4

5

staticfinalinthash(Objectkey){

inth;

return(key==null)?0:(h=key.hashCode())^(h>>>16);

}

这里直接调用了key的hashCode方法。那么我们现在就需要一个类hashCode可以执行某些东西即可。

很幸运的我们发现了URL类,它有一个有趣的特点,就是当执行hashCode方法时会触发当前URL

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值