序列化
之前看到现在安全研究有一个领域是做序列化相关的攻防,因此对序列化产生了好奇,这里进行初步的探索。
什么是序列化
简单来说,将对象转换为字节序就是序列化,而将字节序还原成对象就是反序列化。在OOP的程序中,对象都是加载在内存中的,那么将对象持久化,就要想办法把对象按照一定的格式存储下来,类似于json就是一个合适的存储方式,但json还是一个k-v对,直接使用字符串通信也不是最终形式,网络传输中的数据都是二进制流的字节序。此时就将对象直接转换为字节序。
按照我的理解,序列化类似于网络协议,就是按照规定的格式将对象输出为字节序。序列化的过程就是协议封装的过程,反序列化的过程就是协议解析的过程。
应用场景和方法
序列化的应用场景就是暂存对象当时的状态,可能内存中要加载太多的对象导致内存消耗过高,就将对象状态暂存下来,需要使用的时候再进行调用;将对象直接通过网络传输,而不是通过网络传输数据。序列化的方法就不具体讲了,其实我也不了解,实现serialization接口和exserialization接口就可以,可以自己实现,也可以使用java的内建实现。
序列化的安全问题
和众多的安全问题一样,由于不合理的权限控制和过多的信息暴露,使得攻击者可以通过已知信息猜测、构造出非法的数据输入,达到其攻击的目的。有时在开发中反序列化接口的信息暴露出来,攻击者根据API构造相应的数据,调用反序列化API后解析出攻击代码,对系统产生了攻击。避免漏洞的方法也是从权限和信息保护来着手的,一方面不能暴露出反序列化的API,一方面要对输入信息的权限进行合理控制。