Java反序列化漏洞学习实践一-从Serializbale接口开始先弹一个计算器

0x0、基本概念

1、什么是序列化和反序列化

Serialization(序列化)是指把Java对象保存为二进制字节码的过程;反序列化deserialization是把二进制码重新转换成Java对象的过程。

2、什么情况下需要序列化

a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;

b)当你想用套接字在网络上传送对象的时候;

c)当你想通过RMI传输对象的时候;

总之,序列化的用途就是传递和存储。

3、如何实现序列化

将需要序列化的类实现Serializable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明这个类可以被序列化。

序列化与反序列化都可以理解为“写”和“读”操作 ,通过如下这两个方法可以将对象实例进行“序列化”与“反序列化”操作。


Java反序列化漏洞学习实践三-理解java的动态代理机制

0x0、基础

代理的使用场景:某程序员入职公司接手了一个项目,他读源码发现某些地方可以增强,比如在某些函数执行前应该打印日志。如果他直接在原始代码的基础上直接修改容易出错,他的做法是:自己实现一个类,和原始类实现相同的接口(或者继承相同的类),通过在方法中引用老程序的方法来实现自己的方法,从而实现在不改动源代码的基础上达到增强方法的目的。

代理模式:为其他对象提供一种代理以便控制对这个对象的访问(所谓控制,就是可以在其调用行为前后分别加入一些操作)。

代理模式分类:

  1. 静态代理,其实质是类的继承或接口的实现,比较容易理解,注意结合场景。
  2. 动态代理(Jdk动态代理),这是我们需要关注的重点,在反序列化漏洞的场景中需要用到!
  3. cglib动态代理

Java反序列化

Java反序列化

背景

Java反序列化漏洞最早是2015年年初AppSecCali会议上提出了漏洞利用思路,在2015年11月FoxGlove Security 安全团队才真实利用Java反序列化和Apache Commons Collections这一基础类库实现远程命令执行的,这个漏洞直接 可以攻击WebLogic、WebSphere、JBoss、Jenkins、OpenNMS的最新版,在当时被称为是”2015年最被低估的漏洞”。

Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库,它提供了很多强有 力的数据结构类型并且实现了各种集合工具类。包括FileUpload、Betwixt、Commons Code、Commons Compress、 Commons CSV等开源工具(下面是JAVA COLLECTION 的介绍)。