InvokerTransformer
类的transform方法中可以invoke调用恶意方法
ConstantTransformer
类的transform方法返回一个Object属性,参数任意
ChainedTransformer
类的transform方法循环调用属性的transform方法
TransformedMap
类的decorate适用于实例化TransformedMap
,checkSetValue调用transform
利用AbstractInputCheckedMapDecorator.EntrySet
这个内部类setValue方法调用checkSetValue
AnnotationInvocationHandler
类readobject方法,反序列化入口,调用内部类setValue方法
LazyMap
类的get方法调用transform方法
AnnotationInvocationHandler
类的invoke方法调用get
AnnotationInvocationHandler
类readObject方法中调用entrySet时,利用动态代理调用invoke
ChainedTransformer
类的transform方法循环调用属性的transform方法
ClassLoader
类的define或者defineClass将字节码加载为内存形式的class对象,最后配合newInstance实例化
TemplatesImpl
类的newTransformer里面会把恶意字节define并实例化
InvokerTransformer
类的transform方法中可以invoke调用newTransformer
PriorityQueue
类的readObject里面调用compare方法
TransformingComparator
类的compare方法调用transform方法
TrAXFilter
类的构造函数调用newTransformer方法
AnnotationInvocationHandler
类readObject方法
InstantiateTransformer
类transform方法能实例化任意类(TrAXFilter)
TemplatesImpl
类的newTransformer里面会把恶意字节define并实例化
AnnotationInvocationHandler
类readObject方法中调用entrySet时,利用动态代理调用invoke
AnnotationInvocationHandler
类的invoke方法调用get
LazyMap
类的get方法调用transform方法
ChainedTransformer
类的transform方法循环调用属性的transform方法
PriorityQueue
类的readObject里面调用compare方法
TransformingComparator
类的compare方法调用transform方法
InstantiateTransformer
类transform方法能实例化任意类(TrAXFilter)
TemplatesImpl
类的newTransformer里面会把恶意字节define并实例化
ChainedTransformer
类的transform方法循环调用属性的transform方法
TrAXFilter
类的构造函数调用newTransformer方法
TiedMapEntry
类toString方法调用getValue方法调用get方法
BadAttributeValueExpException
的readObject方法调用getKey方法
LazyMap
类的get方法调用transform方法
ChainedTransformer
类的transform方法循环调用属性的transform方法
InstantiateTransformer
类transform方法能实例化任意类(TrAXFilter)
TrAXFilter
类的构造函数调用newTransformer方法
TemplatesImpl
类的newTransformer里面会把恶意字节define并实例化
TiedMapEntry
类的hashCode方法调用getValue方法调用get方法
HashMap
类的put方法调用hash方法调用hashCode方法
HashSet
的readObject调用put方法
LazyMap
类的get方法调用transform方法
ChainedTransformer
类的transform方法循环调用属性的transform方法
InvokerTransformer
类的transform方法中可以invoke调用恶意方法
HashMap
类的readObject方法调用hash方法调用hashCode方法
TiedMapEntry
类的hashCode方法调用getValue方法调用get方法
LazyMap
类的get方法调用transform方法
ChainedTransformer
类的transform方法循环调用属性的transform方法
InvokerTransformer
类的transform方法中可以invoke调用恶意方法
HashMap
类的readObject方法调用hash方法调用hashCode方法
TiedMapEntry
类的hashCode方法调用getValue方法调用get方法
LazyMap
类的get方法调用transform方法
ChainedTransformer
类的transform方法循环调用属性的transform方法
InstantiateTransformer
类transform方法能实例化任意类(TrAXFilter)
TrAXFilter
类的构造函数调用newTransformer方法
TemplatesImpl
类的newTransformer里面会把恶意字节define并实例化
HashTable
的readObject方法调用equals方法调用reconstitutionPut方法调用key的equals方法
AbstractMap
类equals方法调用get方法
LazyMap
类的get方法调用transform方法
ChainedTransformer
类的transform方法循环调用属性的transform方法
InvokerTransformer
类的transform方法中可以invoke调用恶意方法
PriorityQueue
类的readObject里面调用compare方法
TransformingComparator
类的compare方法调用transform方法
ChainedTransformer
类的transform方法循环调用属性的transform方法
InstantiateTransformer
类transform方法能实例化任意类(TrAXFilter)
TrAXFilter
类的构造函数调用newTransformer方法
TemplatesImpl
类的newTransformer里面会把恶意字节define并实例化
PriorityQueue
类的readObject里面调用compare方法
BeanComparator
的compare方法调用静态方法PropertyUtils.getProperty
(让使用者可以直接调用任意 JavaBean 的 getter 方法)调用TemplatesImpl的getOutputProperties方法
TemplatesImpl
的getOutputProperties方法调用newTransformer方法
TemplatesImpl
类的newTransformer里面会把恶意字节define并实例化
流程同CB1
DiskFileItem
的readObject方法调用write方法
ThresholdingOutputStream
的write方法调用getStream().write(b)方法
FileOutputStream
的write方法调用writeBytes方法
PoolBackedDataSourceBase
类的writeObject写了connectionPoolDataSource属性,实际上写的是Referenceable对象
ReferenceableUtils
的referenceToObject方法实例化由urlclassloader得到的恶意类
PoolBackedDataSourceBase
的readObject方法调用getObject方法
ReferenceableUtils
的getObject方法调用静态方法ReferenceableUtils.referenceToObject
通过客户端调用lookup方法,得到引用进而得到一个类,最后实例化这个类,调用它的getObjectInstance。所以我们要找哪些常用库的类有getObjectInstance方法,并且能触发恶意行为
org.apache.naming.factory.BeanFactory类有getObjectInstance方法,里面可以反射调用el表达式的eval方法执行命令
C3P0结合JNDI注入_Tomacat_EL表达式
利用SPI机制,java.net.URLClassLoader
调用远程的类通过newInstance进行实例化进而执行命令
EventHandler.invoke()->EventHandler.invokeInternal()->MethodUtil.invoke()调用恶意方法
首先确定标签类型,然后寻找响应的转换器,把它们put进Map中,然后convert
compareTo方法触发invoke,进而调用恶意方法
BeanIntrospector.getPropertyDescriptors
会获取所有getter/setter,可以获得TemplatesImpl的getOutputProperties方法
TemplatesImpl
的getOutputProperties方法调用newTransformer方法
TemplatesImpl
类的newTransformer里面会把恶意字节define并实例化
HashMap
类的readObject方法调用putVal方法,进而调用AbstractMap
的equals方法,再调用EqualsBean
的equals方法
EqualsBean
的equals方法调用beanEquals方法
EqualsBean
的beanEquals方法获得并执行TemplatesImpl的getOutputProperties方法
HashSet
的readObject调用put方法
HashSet
的put调用equals方法,进而调用动态代理AnnotationInvocationHandler
类的invoke方法调用equalsImpl方法
AnnotationInvocationHandler
类的equalsImpl方法调用type属性对应类的所有方法(TemplatesImpl
类的newTransformer方法)
TemplatesImpl
类的newTransformer里面会把恶意字节define并实例化
org.aspectj.weaver.tools.cache.SimpleCache
类中内部类 StoreableCachingMap
继承了HashMap
,其put
方法当中的writeToPath
能触发任意文件的写入
parseObject时,会调用类中所有get方法
getConnection调用了createDataSource
createDataSource调用了createConnectionFactory
org.apache.commons.dbcp.BasicDataSource
类的createConnectionFactory方法中可以自定义类加载器去加载字节码
com.sun.rowset.JdbcRowSetImpl
类的setAutoCommit方法调用了connect方法,connect方法调用InitialContext.lookup()
,其参数是setDataSourceName方法中设置的值
parseObject时,会调用类中所有get方法
解析时调用TemplatesImpl
的getOutputProperties方法
TemplatesImpl
的getOutputProperties方法调用newTransformer方法
TemplatesImpl
类的newTransformer里面会把恶意字节define并实例化