CB1 链的原理

1,调用链分析

jdk 自带的文件 PriorityQueue.java]

~>PriorityQueue.java#readObject(jdk 自带,搜索 PriorityQueue,展开结构,搜索 readObject)[PriorityQueue.java]

~> heapify[PriorityQueue.java]

~>siftDown(size 值大于等于 2)[PriorityQueue.java]

~>siftDownUsingComparator[PriorityQueue.java]

~>comparator.compare,点击 comparator[PriorityQueue.java]

~>Comparator<? super E> comparator,点击 Comparator,它和 Comparator.java 在同一个报下,不用导包直接调用即可 [PriorityQueue.java]

~>Comparator[Comparator.java]

CB 链 Jar 包类文件 BeanComparator.class

~>点开接口,找到 BeanComparator.class 并点击跳转(jar 包类文件,它来自 org.apache.commons.beanutils)[BeanComparator.class]

链的交互 TemplatesImpl.java

~>回到 if (comparator.compare(x, (E) e) >= 0)[PriorityQueue.java]

~> 思路点 BeanComparator.compare,BeanComparator.class 构造器搜索 compare,注意满足 this.property 条件不为空 [BeanComparator.class]

~>PropertyUtils.getProperty[BeanComparator.class]

~>思路点 TemplatesImpl#getOutputProperties(),让 o1=TemplatesImpl,this=this.property[BeanComparator.class]

~>搜索 TemplatesImpl,点击 Scope,* ,构造器中定位 getOutputProperties。

~> newTransformer().getOutputProperties(),点击 newTransformer()[TemplatesImpl.java]

~>getTransletInstance()[TemplatesImpl.java]

~>defineTransletClasses()[TemplatesImpl.java]

~>loader.defineClass(_bytecodes[i])

~>字节码加载触发 RCE 代码块

2,条件控制

条件 1:(size 值大于等于 2)

条件 2:comparator != null

条件 3:property != null

条件 4:o1=TemplatesImpl,this.property=outputProperties

3,疑问

我想不通,PriorityQueue.java 中调用了接口 Comparator.java,BeanComparator.class 调用了接口 Comparator.java