这两年关于序列化与反序列化出现的这个安全问题和漏洞很多,所以就经常会有小伙伴来问我说这个序列化反序列化到底是个什么东西,我来给大家来讲一讲这个序列化的原理和反序列化的原理,以及这个安全问题这些漏洞成因大概是什么。那么首先咱就给大家来讲一讲这个序列化是个什么东西,它一般都是出现在这个 Java或者php编写的一些应用程序网站中,在代码运行的时候,我们可以看到有很多对象,就是你经常写代码就会发现说Java里头有很多对象这么一个东西,可以是一个对象,也可以是一类对象的集合,那么很多对象数据,这些数据中有些信息我们想让它持久的保存起来,序列化就是把内存里面这些对象给变成一连串的字节,去描述的这么一个过程。
常见的就是存成文件或者是存到数据库里头,各种各样的对象如果不进行序列化直接存储,就容易产生很多意想不到的bug。那么比较容易出现问题的,也就是最常用的一种应用场景,也就是存储到数据库里。那么有些小伙伴可能就会问了,说我正常情况下我也可以把它存成文件存到数据库里,为什么我要去做序列化,除了是让这些复杂的对象,这些数据变得更可读可写,还有就是因为包括他们派在内的很多这个外部环境,它都需要你去进行序列化操作。
那么说完序列化,我们就要讲一下反序列化是什么,反序列化是将字节流还原的原始对象的完整功能的副本这么一个过程,这句话可能有点绕,那这句话是对这个规范的一句话,它的状态跟序列化时的状态是完全相同的,就是你还原完之后,它是一个完整的副本,状态都是一样的。
所以反序列化说简单一点,它就是把原来你序列化之前的这个数据给你还原出来,所以反序列化之后,这个网站的逻辑就可以与这个反序列化对象进行交互,就像与其他任何对象交互一样,而且把它恢复完之后,它可以重新放回到程序代码里头,程序为什么要这么做,很多时候其实就是为了说用户的这个数据它要进行一定的修改,然后执行用户的一些命令,所以它需要反训练化回去。
如果你反序列化的,数据是用户一定程度上可以去操控的,那么就容易出现这个代码注入反序列化漏洞,远程代码执行这些问题。渗透攻击者可以用完全不同类的对象替换这个序列化对象,而且网站可用的任何类对象都可以被反序列化和实例化,他不会在乎也不用去在乎,就不管预期的是哪一个类,这也就是说它即使在无法执行远程代码情况下,其实这个不安全的返回的话,也可以形成像拒绝服务攻击或者特权升级任意文件访问这些问题。
那么对于这类漏洞怎么去防护,其实就可以采取禁止这个 Jvm执行外部命令这么一种方法。而且记得更新这个环境和最新的版本,因为最新版本的apache等环境其实已经对相关的危险的累做了一些安全的处理。由于反序列化这个漏洞涉及到的面很多,它包括2种编程语言里的数10种的这个操作,还有数10种的这个函数类这些,所以今天只能做一个抛砖引玉的效果,无法覆盖掉全面所有的这个漏洞类型。