你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Java代码审计——Commons Collections6 HashSet

2021/12/15 16:41:54

0x00 前言

cc6主要还是c部分的利用,就是触发LazyMap的问题。

0x01 HashSet

cc6中最主要的就是将TiedMapEntry的调用。HashMap的put调用hash然后调用hashcode可以触发 TiedMapEntry的hashCode,然后调用HashMap.put从而触发整条链

1.HashMap

首先来看HashMap中的hashcode
在这里插入图片描述
hashcode在hash方法中进行了调用
hash在多个方法中进行了调用,这里以put为例
在这里插入图片描述
那么我们的问题就是如何去触发这个put。

2.HashSet

在HashSet的readObject中可以看到首先是进行了实例化,然后又调用了put,正好触发到hashmap的put触发。
在这里插入图片描述

那么现在就要去构造HashSet的变量值。这里我们用的变量是map,那么我们需要先对map进行一个强制赋值。

poc:

Field f1=HashSet.class.getDeclaredField("map");
f1.setAccessible(true);
HashMap hs= (HashMap) f1.get(hashSet);

实际上可以理解为,满足HashMap的条件。那么这样就可以从HashSet->TiedMapEntry->LazyMap->HashMap的构造