[Java反序列化]CommonsCollections3利用链学习

Posted Y4tacker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Java反序列化]CommonsCollections3利用链学习相关的知识,希望对你有一定的参考价值。

文章目录

利用思路

绕过了对InvokerTransformer的利用,替代方法是这⾥⽤⼀个新的
Transformerorg.apache.commons.collections.functors.InstantiateTransformer,通过利⽤ InstantiateTransformer来调⽤到TrAXFilter 的构造⽅法,再利
⽤其构造⽅法⾥的 templates.newTransformer() 调⽤到 TemplatesImpl⾥的字节码

漏洞利用链分析

首先是AnnotationInvocationHandler.classreadObject方法,为了调用set方法触发回调的过程,这个来源于this.memberValues.entrySet().iterator()(从这里不难看出需要一个传入Map)

set触发"回调"

触发了Transformer类的回调过程

从构造的payload这里我们也不难看出是为了实例化一个TrAXFilter

当然再往下跟踪这里也验证了我们的猜想

到了最关键的地方了,调用newTransformer,后面和我上一篇文章分析的过程一致[Java安全]利用TemplatesImpl执行字节码

接下来触发了TransletClassLoaderdefineClass方法

成功通过执行defineClass加载出我们的字节码

计算器弹出来

扣个小细节_tfactory我个人觉得可以不用加上,但可能是大师傅觉得加上这个减少报错条件,现在太菜了还是猜不透加这个原因,毕竟与这个相关的调用也在我们弹出计算器之后了
还有一个细节是

从上图中我们不难看出TemplatesImpl 中对加载的字节码是有一定要求的:这个字节码对应的类必须
com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet 的子类
可以看到在readObject中首先设置为-1


如果不想在这里抛出异常终止那就必须是com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet 的子类

因此最终在这里实例化我们自定义的恶意代码类

因此成功执行恶意代码,弹出了计算器

利用代码

phith0n/JavaThings

以上是关于[Java反序列化]CommonsCollections3利用链学习的主要内容,如果未能解决你的问题,请参考以下文章

什么是java的序列化和反序列化?

Java序列化与反序列化

Java序列化与反序列化

Java序列化与反序列化

java 对象序列化与反序列化

Java序列化与反序列化