Java 反序列化与表达式注入漏洞深度剖析
1. Java 反序列化漏洞概述
在 Java 编程中,反序列化漏洞是一个常见且危险的安全隐患。我们先来了解下相关的基础知识,包括漏洞入口点和数据特征。
1.1 漏洞入口点
Java 反序列化过程的入口点是对 ObjectInputStream
对象调用 readObject
函数。不过,我们必须考虑序列化数据的来源是否可由用户控制,这些数据来源可能包括 Web 应用中的 cookie、GET 参数、POST 参数、流、HTTP 头或数据库等。
1.2 数据特征
序列化数据的头部通常是固定的,但字节流在传输过程中可能会被编码。我们可以尝试对编码数据进行解码,并检查数据的前缀。正常序列化数据的字节流前缀为 ac ed 00 05
,经过 Base64 算法编码后会变成 rO0AB
。
2. 反序列化漏洞利用方式
使用 JDK 内置 Serializable
编码的反序列化漏洞有两种不同的利用方式。
2.1 生成完整对象前的利用
这种方式是在 JDK 对恶意序列化数据进行反序列化的过程中实现攻击效果。它主要基于对 Java 开发中频繁调用函数的理解,来寻找漏洞触发点。例如, commons-collections 3.1
反序列化利用中的经典 RCE 小工具,就是以 readObject
函数为入口点