序列化与反序列化

Java 是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级 Web 应用开发和移动应用开发。其中反序列化漏洞也是 Java Web 中比较常见的一个高危漏洞,近年来很多 Java 的中间件都被曝出过反序列化漏洞。

序列化与反序列化

序列化是将 Java 对象转换成字节流的过程。而反序列化是将字节流转换成 Java 对象的过程。

序列化和反序列化的目的为了更方便进行数据和对象的存储、网络传输。

内存中存在大量的对象,会让内存负担过重,就像常见的 session 对象,如果有数以万计的用户并发去访问,那就会同样出现数以万计的 session 对象,这时 Web 应用会将一些 session 先序列化存储在硬盘中,等需要使用的时候,再将其反序列化,还原到内存中,节约计算机内存资源。

Java 反序列化漏洞原理

如果 Java 应用对用户输入没有过滤,即不可信数据做了反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在产生过程中就有可能带来任意代码执行。

漏洞挖掘

白盒测试

可以在代码中搜索一些高危函数 XMLDecoder.readObject、Yaml.load、XStream.fromXML等,确定了反序列化输入点后,再观察应用的 ClassPath 中是否包含 ApacheCommons Collections 等危险库,若不包含危险库,则查看一些涉及命令、代码执行的代码区域,防止因代码不严谨,导致反序列漏洞的产生。若包含危险库,则使用 ysoserial 开源工具进行攻击复现。

黑盒测试

可以通过抓包来检测请求中可能存在的序列化数据。序列化数据通常以 AC ED 开始,之后的两个字节是版本号,版本号一般是 00 05 但在某些情况下可能是更高的数字。

参考资料

results matching ""

    No results matching ""