WEB攻击模式库之反序列化学习总结
1.1.序列化反序列化是什么(what)
-
序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。核心作用是对象状态的保存与重建。
-
反序列化:客户端从文件中或网络上获得序列化后的对象字节流,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。
1907年3月12日,一个叫斯坦因的英国人来到敦煌,随后的几天里,他通过小恩小惠取得了守护人王道士的信任,并在3月16日进入了千佛洞。
那一天,一个震惊世界的文化奇迹从历史的尘封中露出真貌,这——便是敦煌。
那里曾经风雨西窗,那里曾经衰草斜阳。
斯坦因以极低的价格买走了许多珍贵的文物,其中不乏精美的壁画。因为有些壁画实在过于庞大,为了方便运输,斯坦因竟然“肢解”了它们,尽管这些壁画在到达英国后经过了重新拼装,但却带来了不可估量的艺术损失。
斯坦因将壁画切割成碎片,再从碎片恢复成原样的过程,就是对象的序列化与反序列化过程。
序列化和反序列化的本质是实现对象数据类型转换(比如对象转换成切片),而对象类型转换的目的是方便数据的存储和传输。
1.2.为什么需要序列化,反序列化(why)
一:对象序列化可以实现分布式对象。
主要应用例如:RMI(即远程调用Remote Method Invocation)要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
二:对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。
可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。
三:序列化可以将内存中的类写入文件或数据库中。
比如:将某个类序列化后存为文件,下次读取时只需将文件中的数据反序列化就可以将原先的类还原到内存中。也可以将类序列化为流数据进行传输。
总的来说就是将一个已经实例化的类转成文件存储,下次需要实例化的时候只要反序列化即可将类实例化到内存中并保留序列化时类中的所有变量和状态。
四:对象、文件、数据,有许多不同的格式,很难统一传输和保存。
序列化以后就都是字节流了,无论原来是什么东西,都能变成一样的东西,就可以进行通用的格式传输或保存,传输结束以后,要再次使用,就进行反序列化还原,这样对象还是对象,文件还是文件。
1.3. 序列化反序列化的如何实现(how)
marshal/unmarshal encode/decode
2.1. 反序列化攻击如何攻击的(what)
简单来说
- 黑客构造一个恶意的调用链(专业术语为 POP,Property Oriented Programming),并将其序列化成数据,然后发送给应用;
- 应用接收数据。大部分应用都有接收外部输入的地方,比如各种 HTTP接口。而这个输入的数据就有可能是序列化数据;
- 应用进行反序列操作。收到数据后,应用尝试将数据构造成对象;
- 应用在反序列化过程中,会调用黑客构造的调用链,使得应用会执行黑客的任意命令。
在这个反序列化的过程中,应用为什么会执行黑客构造的调用链呢?这是因为,反序列化的过程其实就是一个数据到对象的过程。在这个过程中,应用必须根据数据源去调用一些默认方法(比如构造函数和 Getter/Setter)。
除了这些方法,反序列化的过程中,还会涉及一些接口类或者基类(简单的如:Map、List 和 Object)。应用也必须根据数据源,去判断选择哪一个具体的接口实现类。
也就是说,黑客可以控制反序列化过程中,应用要调用的接口实现类的默认方法。通过对不同接口类的默认方法进行组合,黑客就可以控制反序列化的调用过程,实现执行任意命令的功能。
2.2.反序列化攻击如何防范(how)
序列化和反序列化的操作产生了一些警惕。那你可能要问了,既然反序列化漏洞危害这么大,我们能不能直接剔除它们呢?显然是不可能的,尤其是 JSON,作为目前最热门的跨平台数据交换格式之一,其易用性是显而易见的,你不可能因为这些还没发生的危害就剔除它们。
因此,我们要采取一些有效的手段,在把反序列化操作的优势发挥出来的同时,去避免反序列化漏洞的出现。我们来看 3 种具体的防护方法:认证、限制类和 RASP 检测。
1.认证,通过签名加密等对源身份进行校验
2.黑名单列表,白名单校验
3.依赖第三方工具
本文来自博客园,作者:易先讯,转载请注明原文链接:https://www.cnblogs.com/gongxianjin/p/17218396.html