CommonsCollections7


触发POC

利用IDEA创建一个maven项目,导入依赖

利用新的ysoserial生成payload:

得到

这里用的jdk1.8.0_121

触发Poc

 

分析利用链

Step 0

入口点变为了java.util.HashtablereadObject()

CC6,这里key,value都可控

这里for循环作用是会把每个key-value利用reconstitutionPut(table, key, value)设置到table

 

Step 1

reconstitutionPut(table, key, value)

看到1129行有个key.hashCode()key又可控,立马想到CC6的利用链

先试一试能不能构造,确实可以:

 

然而CC7并非是这样,其是利用相对复杂的reconstitutionPut()中的e.key.equals(key)key,value都可控)

Q: 这里有个hash & 0x7FFFFFFF,干啥用的?

A: 为了使index的第一位为0,也就是为了得到一个正数(有符号数第一位0代表正数,1代表负数)

可以看到要执行到这里e.hash需等于hashe来自tab[index]

也就是说要触发到equals(key)必须使传入当前键与下一个键的hashCode()相同

恰好又存在这种情况,如ccdDhashCode()就是相同的

 

Step 2

接下来分析e.key.equals(key)的利用方式

要利用这个的话,首先e.key这里不能直接是cc或者dD字符串,而应该是一个可控的任意对象

利用的是LazyMap,所以e.key这里要是一个LazyMap对象,后文构造exp再细说

LazyMap其类中本身没有equals()方法

但其父类AbstractMapDecoratorequals()方法如下:

this.map来自LazyMap的构造方法(object就是上面的key,可控)

super(map)调用AbstractMapDecorator(Map map)

this.map这里利用链传入了HashMap,而HashMap中也没有equals(),最终是调用的HashMap的父类java.util.AbstractMapequals()

 

Step 3

看到AbstractMapequals()方法,其中又有m.get()

m来自o,o就是上面的object,可控)

终究是回到了get()

 

构造EXP

Step 0

同之前EXP part 1

 

Step 1

上面说e.key这里不能直接是cc或者dD字符串,而应该是一个可控的LazyMap,设置2个lazyMap后其hashCode()还是相等吗?确实

EXP part 2

 

Step 2

接下来是要把2个lazyMap塞进Hashtable

EXP part 3

 

Step 3

但由于第二次put()lazyMap2会多出一个cc

CC6remove()即可

 

整合EXP