今天在学习的时候又接触到了JAVA反序列化漏洞。一直只知道JAVA反序列化就是利用反序列化工具进行攻击,在目标系统中执行命令,利用的就是传输对象时采用JAVA序列化。但是也只知道这么多了。所以,就想着今天再了解一下反序列化漏洞。
顺便,再写个笔记。
JAVA序列化
- 什么是JAVA序列化?
序列化可以让数据持久化,将对象等数据转化成字节序列,也就是八位01序列,存储在存储器中。
在数据传输中,便可以利用JAVA序列化让复杂的数据变成01序列进行传输。
序列化: 对象 --> 字符串
反序列化: 字符串 --> 对象
序列化协议:
XML&SOAP、JSON、Protobuf
- JAVA序列化的实现
我初步学习时了解到:JAVA序列化的实现依赖Serializable接口。
但是,实际上JAVA反序列化的实现还有其他的框架,比如Protobuf框架和Jackson框架,在一些情况下,其他框架比原有的Serializable接口实现选择优先级更高。
JAVA序列化实现的方式对反序列化漏洞影响非常大,因为反序列化漏洞的关键是利用JAVA反序列化时使用的构造器方法、setter方法等。也就是说:不同的实现方式导致序列化的方式不同,利用反序列化漏洞的方式也截然不同。
JAVA反序列化漏洞
拿原生的JAVA序列化为例。
- 漏洞根源
主要的攻击操作是:攻击者通过构造一个恶意的序列化数据,诱导程序在反序列化过程中执行到预期之外的恶意代码,从而实现远程代码执行(RCE).
攻击发生的入口是反序列化类的readObject()。
readObject和writeObject()是JAVA序列化的核心方法,用于自定义序列化/反序列化逻辑的两个私有方法。这两个方法可以由开发者重写。如果反序列化中的readObject被类重写,那么就会优先执行其中的自定义逻辑。这个便是攻击的起点。
- Gadget Chain
Gadget Chain是一条攻击链,通过多个类的方法调用而串联成的执行路径。
也就是说,是将原有的各种方法调用过来,组合成能够达到自己目的的“逻辑代码”。攻击者把Gadget Chain封装成二进制数据发送给目标,便可以实现攻击。
利用这条路径便可以实现任意代码执行(RCE)。
构造方法:
Commons Collections库中,有ConstantTransformer、InvokerTransformer。
ConstantTransformer中有transform()方法会恒等地返回一个你指定的对象。
InvokerTransformer中有transform(Object input)方法可以通过反射,调用input对象的任意方法。
利用这两个方法,可以获得到组装Gadget Chain的各个方法,从而构造Gadget Chain。
- 反序列化工具
ysoserial是一个著名的漏洞利用生成工具,预置了大量针对不同JAVA库的Gadget链,可以一键生成恶意序列化数据,可以大大提高攻击效率,降低攻击门槛。
反序列化漏洞是非常重要的漏洞。
它的影响范围很广,几乎所有主流的Java框架和库都爆发过JAVA反序列化漏洞事件。而只要业务代码依赖于一个存在该漏洞的库,且对外使用JAVA反序列化进行传输,那么就可能遭到JAVA反序列化攻击。
而且危害等级很高,反序列化漏洞往往会导向RCE,直接实现对目标的控制。ysoserial等工具又让攻击的门槛大大降低,非常简单便可以造成致命的危害。而且难检测、难修复。
护网中一定要针对JAVA反序列化进行渗透测试