【缺陷周话】第40期:JSON 注入
字数 1056 2025-08-18 11:38:45
JSON 注入漏洞分析与防御指南
1. JSON 注入概述
JSON注入是指应用程序解析的JSON数据来源于不可信赖的数据源,且程序未对这些数据进行充分验证和过滤。当应用程序使用未经验证的输入构造JSON时,攻击者可以更改JSON数据的语义。
相关CWE: CWE-91: XML Injection (aka Blind XPath Injection)
2. JSON 注入的危害
- 允许攻击者在JSON数据中插入恶意元素
- 可能导致业务逻辑被篡改
- 可能引发XSS(跨站脚本攻击)
- 可能导致动态代码解析漏洞
- 严重情况下可获取系统管理权限
历史案例:
- CVE-2018-7951:华为服务器iBMC的JSON注入漏洞,可修改管理员密码
- CVE-2018-7904:华为1288H V5和288H V5的JSON注入漏洞,可获取系统权限
3. 漏洞原理分析
3.1 漏洞代码示例
// 接收请求参数feedback中的JSON数据
public void completed(@RequestParam String feedback) {
ObjectMapper objectMapper = new ObjectMapper();
// 直接将未经验证的JSON字符串转换为对象
Map<String, Object> jsonObject = objectMapper.readValue(feedback.getBytes(), Map.class);
}
3.2 攻击原理
JSON通过特殊字符(引号、冒号、逗号、花括号)区分语义。当输入包含这些特殊字符时:
- 正常JSON:
{"username":"admin","password":"adminpassword"} - 恶意输入:
{"username":"admin","password":"admin"password"}
其中admin"password中的引号会破坏JSON结构,导致解析失败或语义改变。
4. 防御措施
4.1 使用专用JSON编码器
import com.fasterxml.jackson.core.io.JsonStringEncoder;
public void completed(@RequestParam String feedback) {
ObjectMapper objectMapper = new ObjectMapper();
// 使用JsonStringEncoder处理JSON数据
JsonStringEncoder encoder = JsonStringEncoder.getInstance();
byte[] encodedBytes = encoder.quoteAsUTF8(feedback);
Map<String, Object> jsonObject = objectMapper.readValue(encodedBytes, Map.class);
}
4.2 其他防御方法
-
输入验证:
- 对JSON数据进行严格的结构验证
- 使用JSON Schema验证数据格式
-
输出编码:
- 对JSON中的特殊字符进行转义
- 使用安全的JSON库自动处理转义
-
安全配置:
- 禁用JSON解析器的危险特性(如外部实体解析)
- 使用最新版本的JSON处理库
5. 检测与修复
5.1 检测方法
- 静态代码分析工具(如代码卫士)可检测JSON注入漏洞
- 手动检查JSON数据处理流程中是否存在未经验证的输入
5.2 修复步骤
- 识别所有接收外部JSON输入的入口点
- 在这些入口点实施严格的输入验证
- 使用安全的JSON处理库和方法
- 对关键业务操作增加二次验证
6. 最佳实践
- 永远不要信任客户端提交的JSON数据
- 对JSON数据进行多层防御(输入验证+输出编码)
- 在关键业务逻辑中使用白名单验证
- 定期更新JSON处理库以修复已知漏洞
- 在SDLC中集成JSON安全测试
通过实施这些措施,可以有效预防JSON注入漏洞,保护应用程序免受此类攻击的威胁。