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
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