Java序列化与反序列化
在2015年11月6日,FoxGlove Security安全团队的@breenmachine 发布的一篇博客[3]中介绍了如何利用Java反序列化漏洞,来攻击最新版的WebLogic、WebSphere、JBoss、Jenkins、OpenNMS这些大名鼎鼎的Java应用,实现远程代码执行。
一、Java序列化和反序列化
序列化就是把对象转换成字节流,便于保存在内存、文件、数据库中;反序列化即逆过程,由字节流还原成对象。Java中的ObjectOutputStream类的writeObject()方法可以实现序列化,类ObjectInputStream类的readObject()方法用于反序列化。
1、Java序列化和反序列化例子
在Java中对象要实现序列化,这个类必须需要实现Serializable或Externalizable接口
在Java中对象要实现序列化,这个对象必须需要实现Serializable或Externalizable接口
从上可得出结论,如果一个类需要序列化那么需要这个类或者父类实现 Serializable或者Externalizable接口。
对一个类进行序列化需要执行ObjectOutputStream.writeObject方法写入 对象 。
对一个类进行反序列化需要ObjectInputStream.readObject从输入流中读 取字节然后转换成对象 。
在反序列的过程中,被反序列化操作的类不会执行构造方法。
2、序列化的特性
序列化后的字节流特征:
开头是 ac ed 00 05 ,如果经过 base64 编码,那么相对应的是rO0AB
二、可定制化的序列化
1、如果类名相同如何进行反序列化?
假设两个相同的类(包位置、类名等都相同,内部属性、方法不同),读取一个类的反序列化内容赋予另一个类:
2、serialVersionUID的作用?
在反序列化的时候保证与本地类的版本相同
3、在序列化一个类的时候,有时候并不想写入多余的数据那该怎么做呢?
transient 关键字修饰成员变量的时候,该成员不会被序列化
三、反序列化漏洞
1、反序列化漏洞成因:
如果Java应用对用户输入,即不可信数据做了反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在产生过程中就有可能带来任意代码执行。
举例1:
运行后会执行命令,弹出计算器