Skip to content

Latest commit

 

History

History
267 lines (132 loc) · 8.56 KB

反序列化漏洞小结.md

File metadata and controls

267 lines (132 loc) · 8.56 KB

CC1_EntrySet

InvokerTransformer类的transform方法中可以invoke调用恶意方法

ConstantTransformer类的transform方法返回一个Object属性,参数任意

ChainedTransformer类的transform方法循环调用属性的transform方法

TransformedMap类的decorate适用于实例化TransformedMap,checkSetValue调用transform

利用AbstractInputCheckedMapDecorator.EntrySet这个内部类setValue方法调用checkSetValue

AnnotationInvocationHandler类readobject方法,反序列化入口,调用内部类setValue方法

CC1_LazyMap

LazyMap类的get方法调用transform方法

AnnotationInvocationHandler类的invoke方法调用get

AnnotationInvocationHandler类readObject方法中调用entrySet时,利用动态代理调用invoke

ChainedTransformer类的transform方法循环调用属性的transform方法

CC2

ClassLoader类的define或者defineClass将字节码加载为内存形式的class对象,最后配合newInstance实例化

TemplatesImpl类的newTransformer里面会把恶意字节define并实例化

InvokerTransformer类的transform方法中可以invoke调用newTransformer

PriorityQueue类的readObject里面调用compare方法

TransformingComparator类的compare方法调用transform方法

CC3

TrAXFilter类的构造函数调用newTransformer方法

AnnotationInvocationHandler类readObject方法

InstantiateTransformer类transform方法能实例化任意类(TrAXFilter)

TemplatesImpl类的newTransformer里面会把恶意字节define并实例化

AnnotationInvocationHandler类readObject方法中调用entrySet时,利用动态代理调用invoke

AnnotationInvocationHandler类的invoke方法调用get

LazyMap类的get方法调用transform方法

ChainedTransformer类的transform方法循环调用属性的transform方法

CC4

PriorityQueue类的readObject里面调用compare方法

TransformingComparator类的compare方法调用transform方法

InstantiateTransformer类transform方法能实例化任意类(TrAXFilter)

TemplatesImpl类的newTransformer里面会把恶意字节define并实例化

ChainedTransformer类的transform方法循环调用属性的transform方法

TrAXFilter类的构造函数调用newTransformer方法

CC5

TiedMapEntry类toString方法调用getValue方法调用get方法

BadAttributeValueExpException的readObject方法调用getKey方法

LazyMap类的get方法调用transform方法

ChainedTransformer类的transform方法循环调用属性的transform方法

InstantiateTransformer类transform方法能实例化任意类(TrAXFilter)

TrAXFilter类的构造函数调用newTransformer方法

TemplatesImpl类的newTransformer里面会把恶意字节define并实例化

CC6_HashSet

TiedMapEntry类的hashCode方法调用getValue方法调用get方法

HashMap类的put方法调用hash方法调用hashCode方法

HashSet的readObject调用put方法

LazyMap类的get方法调用transform方法

ChainedTransformer类的transform方法循环调用属性的transform方法

InvokerTransformer类的transform方法中可以invoke调用恶意方法

CC6_HashMap

HashMap类的readObject方法调用hash方法调用hashCode方法

TiedMapEntry类的hashCode方法调用getValue方法调用get方法

LazyMap类的get方法调用transform方法

ChainedTransformer类的transform方法循环调用属性的transform方法

InvokerTransformer类的transform方法中可以invoke调用恶意方法

CC6_Shiro

HashMap类的readObject方法调用hash方法调用hashCode方法

TiedMapEntry类的hashCode方法调用getValue方法调用get方法

LazyMap类的get方法调用transform方法

ChainedTransformer类的transform方法循环调用属性的transform方法

InstantiateTransformer类transform方法能实例化任意类(TrAXFilter)

TrAXFilter类的构造函数调用newTransformer方法

TemplatesImpl类的newTransformer里面会把恶意字节define并实例化

CC7

HashTable的readObject方法调用equals方法调用reconstitutionPut方法调用key的equals方法

AbstractMap类equals方法调用get方法

LazyMap类的get方法调用transform方法

ChainedTransformer类的transform方法循环调用属性的transform方法

InvokerTransformer类的transform方法中可以invoke调用恶意方法

使用TemplatesImpl改造CC2

PriorityQueue类的readObject里面调用compare方法

TransformingComparator类的compare方法调用transform方法

ChainedTransformer类的transform方法循环调用属性的transform方法

InstantiateTransformer类transform方法能实例化任意类(TrAXFilter)

TrAXFilter类的构造函数调用newTransformer方法

TemplatesImpl类的newTransformer里面会把恶意字节define并实例化

CB1

PriorityQueue类的readObject里面调用compare方法

BeanComparator的compare方法调用静态方法PropertyUtils.getProperty(让使用者可以直接调用任意 JavaBean 的 getter 方法)调用TemplatesImpl的getOutputProperties方法

TemplatesImpl的getOutputProperties方法调用newTransformer方法

TemplatesImpl类的newTransformer里面会把恶意字节define并实例化

CB1_Shiro(无CC依赖)

流程同CB1

FileUpload

DiskFileItem的readObject方法调用write方法

ThresholdingOutputStream的write方法调用getStream().write(b)方法

FileOutputStream的write方法调用writeBytes方法

C3P0

PoolBackedDataSourceBase类的writeObject写了connectionPoolDataSource属性,实际上写的是Referenceable对象

ReferenceableUtils的referenceToObject方法实例化由urlclassloader得到的恶意类

PoolBackedDataSourceBase的readObject方法调用getObject方法

ReferenceableUtils的getObject方法调用静态方法ReferenceableUtils.referenceToObject

JNDI注入_Tomacat_EL表达式

通过客户端调用lookup方法,得到引用进而得到一个类,最后实例化这个类,调用它的getObjectInstance。所以我们要找哪些常用库的类有getObjectInstance方法,并且能触发恶意行为

org.apache.naming.factory.BeanFactory类有getObjectInstance方法,里面可以反射调用el表达式的eval方法执行命令

C3P0_BeanFactory不出网

C3P0结合JNDI注入_Tomacat_EL表达式

SnakeYAML_ScriptEngineManager

利用SPI机制,java.net.URLClassLoader调用远程的类通过newInstance进行实例化进而执行命令

SnakeYAML_JdbcRowSetImpl

XStream_sorted-set

EventHandler.invoke()->EventHandler.invokeInternal()->MethodUtil.invoke()调用恶意方法

首先确定标签类型,然后寻找响应的转换器,把它们put进Map中,然后convert

compareTo方法触发invoke,进而调用恶意方法

ROME

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方法

JDK7u21

HashSet的readObject调用put方法

HashSet的put调用equals方法,进而调用动态代理AnnotationInvocationHandler类的invoke方法调用equalsImpl方法

AnnotationInvocationHandler类的equalsImpl方法调用type属性对应类的所有方法(TemplatesImpl类的newTransformer方法)

TemplatesImpl类的newTransformer里面会把恶意字节define并实例化

AspectJWeaver

org.aspectj.weaver.tools.cache.SimpleCache 类中内部类 StoreableCachingMap继承了HashMap,其put方法当中的writeToPath能触发任意文件的写入

FastJson

1.1.15-1.2.4_BCEL

parseObject时,会调用类中所有get方法

getConnection调用了createDataSource

createDataSource调用了createConnectionFactory

org.apache.commons.dbcp.BasicDataSource类的createConnectionFactory方法中可以自定义类加载器去加载字节码

Fastjson1.22-1.24_JNDI(RMI-or-LDAP)

com.sun.rowset.JdbcRowSetImpl类的setAutoCommit方法调用了connect方法,connect方法调用InitialContext.lookup(),其参数是setDataSourceName方法中设置的值

Fastjson1.22-1.24_TemplateImpl

parseObject时,会调用类中所有get方法

解析时调用TemplatesImpl的getOutputProperties方法

TemplatesImpl的getOutputProperties方法调用newTransformer方法

TemplatesImpl类的newTransformer里面会把恶意字节define并实例化

Jackson