前言由于在2015年底commons-collections反序列化利?链被提出时,Apache Commons Collections有以下两个分?版本:
- commons-collections:commons-collections
- org.apache.commons:commons-collections4
官?认为旧的commons-collections有?些架构和API设计上的问题,但修复这些问题,会产??量不能 向前兼容的改动 。所以,commons-collections4不再认为是?个?来替换commons-collections的新版 本,?是?个新的包,两者的命名空间不冲突,因此可以共存在同?个项?中 。那么很?然有个问题,既然3.2.1中存在反序列化利?链,那么4.0版本是否存在呢?
commons-collections4的改动因为这?者可以共存,所以我可以将两个包安装到同?个项?中进??较:
<dependencies> <!-- https://mvnrepository.com/artifact/commons-collections/commonscollections --><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.1</version></dependency> <!-- https://mvnrepository.com/artifact/org.apache.commons/commonscollections4 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.0</version> </dependency></dependencies
因为?的Gadget中依赖的包名都是org.apache.commons.collections
,?新的包名已经变 了,是org.apache.commons.collections4
。我们?已经熟悉的CC6
利?链做个例?,我们直接把代码拷??遍,然后将所import org.apache.commons.collections.*
改成 import org.apache.commons.collections4.*
。此时IDE爆出了?个错误,原因是LazyMap.decorate
这个?法没了:
文章插图
【Java安全之CC2】看下
decorate
的定义,?常简单:public static Map decorate(Map map, Transformer factory) {return new LazyMap(map, factory);}
这个?法不过就是LazyMap
构造函数的?个包装,?在4中其实只是改了个名字叫lazyMap
public static <V, K> LazyMap<K, V> lazyMap(final Map<K, V> map, finalTransformer<? super K, ? extends V> factory) {return new LazyMap<K,V>(map, factory);}
所以,我们将Gadget中出错的代码换?下名字:Map outerMap = LazyMap.lazyMap(innerMap, transformerChain);

文章插图
同理,之前的CC1,CC3利用链都可以在
commonscollections4
中正常使用commons-collections
之所以有许多利?链,除了因为其使?量?,技术上的原因是其 中包含了?些可以执?任意?法的Transformer
。所以在commons-collections中找Gadget
的过 程,实际上可以简化为,找?条从 Serializable#readObject()
?法到 Transformer#transform()
?法的调?链 。CC2其中两个关键类:
- java.util.PriorityQueue -
- org.apache.commons.collections4.comparators.TransformingComparator
java.util.PriorityQueue
是?个有??readObject()
?法的类:
文章插图
org.apache.commons.collections4.comparators.TransformingComparator 中有调 ?
transform()
?法的函数:public int compare(final I obj1, final I obj2) {final O value1 = this.transformer.transform(obj1); final O value2 = this.transformer.transform(obj2);return this.decorated.compare(value1, value2);}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 3.JS
- 原神夜鸦谁是那个怠惰之人怎么完成
- 不思议迷宫玛尔斯之殿DP隐藏彩蛋攻略大全
- 金铲铲之战驯龙传送法阵容怎么搭配
- 骁龙895处理器消息_骁龙895处理器曝光
- 已购公房买了之后算商品房吗 已购公房有什么优缺点
- 健康喂养之狗粮怎么喂,吃什么狗粮好(谷物狗粮和无谷物狗粮)
- 喜羊羊之死是哪一集?
- .NET应用开发之SQLServer常见问题分析
- C#11之原始字符串