介绍

commons-beanutils是用来操作JavaBean的工具。其中有一个方法可以调用任意类的getter方法。

PropertyUtils.getProperty( o1, property )

分析

TempatesImpl#getOutputProperties方法触发了newTransformer方法,因此我们需要找谁能调用getOutputProperties方法。但实际上只有Process这个无法序列化的类调用了getOutputProperties。

image-20220909201618913

这条链的巧妙就在于利用CB能操纵JavaBean的功能,如果getProperty的两个参数都可控,即调用getOutputProperties

image-20220909201444286

compare就很熟悉了,经典的CC2,于是我们就通过PriorityQueue连通了链子。

image-20220909202216854

调试

触发PriorityQueue反序列化,CC2的一系列流程走到PriorityQueue#siftDownUsingComparator进而触发BeanComparator#compare。

注:为什么不是在上面的if语句调用BeanComparator#compare?因为right=2=size,因此第一个条件不满足,直接跳过该if语句。

image-20220909194436694

进入BeanComparator#compare,PropertyUtils#getProperty方法自动调用JavaBean的getter方法,property被赋值为OutputProperties,因此调用TemplatesImpl#getOutputProperties方法。

image-20220909194924113

接下来调用newTransformer方法,就是标准的TemplatesImpl加载字节码任意代码执行的操作了。

image-20220909195557290

链子

PriorityQueue#readObject
BeanComparator#compare
TemplatesImpl#getOutputProperties
TemplatesImpl#newTransformer
defineClass
newInstance