利用思路
绕过了对InvokerTransformer 的利用,替代方法是这???个新的 Transformer ,org.apache.commons.collections.functors.InstantiateTransformer ,通过利? InstantiateTransformer 来调?到TrAXFilter 的构造?法,再利 ?其构造?法?的 templates.newTransformer() 调?到 TemplatesImpl ?的字节码
漏洞利用链分析
首先是AnnotationInvocationHandler.class 的readObject 方法,为了调用set方法触发回调的过程,这个来源于this.memberValues.entrySet().iterator() (从这里不难看出需要一个传入Map) 
set触发"回调"  触发了Transformer类 的回调过程  从构造的payload这里我们也不难看出是为了实例化一个TrAXFilter 类  当然再往下跟踪这里也验证了我们的猜想  到了最关键的地方了,调用newTransformer ,后面和我上一篇文章分析的过程一致[Java安全]利用TemplatesImpl执行字节码

接下来触发了TransletClassLoader 的defineClass 方法  成功通过执行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
|