CB链
CB 包:Apache Commons BeanUtils
在 Java 中,符合特定规范的类被称为 JavaBean(通常包含私有属性和 getter/setter 方法)。在处理这些对象时,经常需要频繁地反射赋值、拷贝属性,CB 包就是为了简化 JavaBean 的操作与反射而生的
提供了一系列javabean方法
在ysoserial中的CB链中 使用了BeanComparator作为PriorityQueue的中转类 来打CB链
核心类
- PriorityQueue(触发类)
- BeanComparator
- PropertyUtils
- TemplatesImpl(sink)
BeanComparator
根据CC的经验 我们会去触发他的compare方法

方法里面有触发一个PropertyUtils.getProperty方法 猜测会获取对象o1里面的属性
继续更进

实例化一个PropertyUtilsBean对象 调用getProperty方法

继续跟进

进入PropertyUtilsBean.getSimpleProperty方法 上面一系列判断 后面调试再看

下面会调用getPropertyDescriptor(bean, name)
猜测是获取相关属性方法用的 比如setter和getter
Method readMethod = getReadMethod(bean.getClass(), descriptor)
获取读方法 应该是获取getter方法
后面就是直接反射调用

所以说 一系列调用获取javabean的属性 最后会调用和这个属性有关的getter方法
这是BeanComparator的特性 不难想到尝试触发TemplatesImpl.getOutputProperties方法
最后看看怎么传对象到BeanComparator里面

反射调用就行
POC
1 | import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; |

为什么要add两次 并且为什么要反射调用修改都是CB链的细节
调试一下
断点打在PriorityQueue.add这里


直接到这里
siftUpUsingComparator方法调用提前触发comparator.compare

只要BeanComparator有property属性 后面就会继续调用 导致提前触发
所以为了避免提前触发就得后续反射修改
这里基本和CC2一样的道理
有些时候 在构造恶意对象 可能那个方法就不小心提前触发了
所以最好所有的恶意对象都应该在最后的时候反射调用在填入
在这打断点 继续调试


这里的o1就是传入PriorityQueue里面的对象TemplatesImpl

这里好像是判断是否有嵌套 我们这里就是简单的一个对象 没有那么多事 默认都是过的

重点还是这这几个方法调用
获取指定属性的getter

后续反射调用 触发rce

CB链的实质还是触发getter方法
说些什么吧!