Java反序列化之CC6
CC6
参考:https://www.cnblogs.com/1vxyz/p/17447478.html
环境:jdk8u65 && commons-collections 3.2.1
适用:Commons-collections 3.1-3.2.1 && jdk8u301 jdk11 jdk15 jdk16
sink点还是在InvokerTransformer::transform
实际上是CC1 LazyMap链上的一个变种 通过TiedMapEntry.hashcode()触发LazyMap.get()
1 |
|
看一下LazyMap的get方法 想进入transform方法必须保证map中没有这个key
我们从最后的HashMap.put()入手
我们在之前给lazyMap的fatory属性直接赋了一个ConstantTransformer(1)
走到37行时 map2.put()已经触发了 而map2.put()会带来什么结果呢 实际上就直接到tiedMapEntry.hashcode() -> tiedMapEntry.getValue() -> lazyMap.get("aaa")
然后就是给aaa这个key赋了个Integer(1)
あれ 我的HashSet呢? 调试了挺久的 说实话没看出来到底remove了没有 在进到unserialize之前lazyMap.map.containsKey(“aaa”)一直是true 为什么用序列化数据之后进到LazyMap::get()里之后就是false了呢
用HashMap也是可以的(URLDNS链的入口) 这两个readObejct()都可以导到HashMap::hashCode()
给出payload
1 |
|
Java反序列化之CC6
http://example.com/2025/04/06/Java反序列化之CC6/