介绍
commons-beanutils是用来操作JavaBean的工具。其中有一个方法可以调用任意类的getter方法。
PropertyUtils.getProperty( o1, property )
分析
TempatesImpl#getOutputProperties方法触发了newTransformer方法,因此我们需要找谁能调用getOutputProperties方法。但实际上只有Process这个无法序列化的类调用了getOutputProperties。
这条链的巧妙就在于利用CB能操纵JavaBean的功能,如果getProperty的两个参数都可控,即调用getOutputProperties
compare就很熟悉了,经典的CC2,于是我们就通过PriorityQueue连通了链子。
调试
触发PriorityQueue反序列化,CC2的一系列流程走到PriorityQueue#siftDownUsingComparator进而触发BeanComparator#compare。
注:为什么不是在上面的if语句调用BeanComparator#compare?因为right=2=size,因此第一个条件不满足,直接跳过该if语句。
进入BeanComparator#compare,PropertyUtils#getProperty方法自动调用JavaBean的getter方法,property被赋值为OutputProperties,因此调用TemplatesImpl#getOutputProperties方法。
接下来调用newTransformer方法,就是标准的TemplatesImpl加载字节码任意代码执行的操作了。
链子
PriorityQueue#readObject
BeanComparator#compare
TemplatesImpl#getOutputProperties
TemplatesImpl#newTransformer
defineClass
newInstance