[Java反序列化]Java-CommonsBeanutils1利用链分析
Posted Y4tacker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Java反序列化]Java-CommonsBeanutils1利用链分析相关的知识,希望对你有一定的参考价值。
反序列化调用链
ObjectInputStream.readObject()
PriorityQueue.readObject()
PriorityQueue.heapify()
PriorityQueue.siftDown()
siftDownUsingComparator()
BeanComparator.compare()
TemplatesImpl.getOutputProperties()
TemplatesImpl.newTransformer()
TemplatesImpl.getTransletInstance()
TemplatesImpl.defineTransletClasses()
TemplatesImpl.TransletClassLoader.defineClass()
Pwner*(Javassist-generated).<static init>
Runtime.exec()
Java-CommonsBeanutils1利用链分析
首先PriorityQueue 是使用数组实现的完全二叉树优先队列,不允许空值,而且不支持 non-comparable 的对象。由于TemplatesImpl 未实现 Comparable 接口,为了绕过这个,可以看到代码当中首先添加了两个 BigInteger 值为1的对象。BeanComparator 中设置的比较属性为 lowestSetBit,这里也可以改为 BigInteger 其它的可比较属性名称,之后,利用 Java 反射机制将 Comparator的property 设置为 TemplatesImpl 的属性 outputProperties,但是这个属性在这里未起到比较的作用。它的重要作用将在 payload 反序列化时体现。
而PropertyUtils.getProperty 这个方法会自动去调用一个JavaBean的getter方法,
这个点是任意代码执行的关键
还记得之前我跟的TemplatesImpl
调用newTransfer
执行字节码了么
TemplatesImpl#newTransformer() -> TemplatesImpl#getTransletInstance() -> TemplatesImpl#defineTransletClasses() -> TransletClassLoader#defineClass()
我们再往前看TemplatesImpl#getOutputProperties()
,作用域是public,可以被外部调用
这时候我们就要配合使用BeanComparator
BeanComparator
是commons-beanutils
提供的用来比较两个JavaBean
是否相等的类,其实现了java.util.Comparator
接口
下面来跟一波调用流程
继续
继续
BeanComparator
的compare
方法
后面其实没啥好说的,前面我的文章已经分析过很多次TemplatesImpl
的加载字节码的过程
通过getOutputProperties
调用newTransformer
实现我们后面的步骤
分析大致结束Payload可以看参考文章,也可以直接使用ysoserial
参考文章
以上是关于[Java反序列化]Java-CommonsBeanutils1利用链分析的主要内容,如果未能解决你的问题,请参考以下文章