序言
环境要求: Commons-collections 3.1-3.2.1 , java版本无要求
分析
CC5继承的是CC1链,没用到字节码,用的是最朴实的ChainedTransformer

1 | package CC5; |
可以看到前部分和CC1一样,构造ChainedTransformer利用链

接下来利用到两个新对象:TiedMapEntry 和BadAttributeValueExpException

首先看一下这个TiedMapEntry

注意到它有一个getValue函数,会调用get方法,属性map可控。
经过前几条链的分析已经知道Lazymap.get()可以直接触发transform


寻找什么地方有调用getValue(),找到toString() 中简单粗暴的调用

1 | toString() -> getValue() -> Lazymap.get() |
再来看 BadAttributeValueException
readObject()作为入口

一眼望过去就看到 toString()的调用,并且valObj是获取的val属性值,所以之前我们通过反射设置了val的值

就和TiedMapEntry联系起来了
就像上面所说的一样,调用Lazymap的get,最后触发ChainedTransform.transform()执行命令。
调用链
1 | BadAttributeValueExpException.readObject |
结尾
CC5太轻松了,继承CC1,比CC1简单,建议先分析一遍CC1。新用到的TiedMapEntry和BadAttributeValueException都很友好,一目了然。