序言
环境要求: 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
都很友好,一目了然。