【缺陷周话】第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 其他防御方法

  1. 输入验证

    • 对JSON数据进行严格的结构验证
    • 使用JSON Schema验证数据格式
  2. 输出编码

    • 对JSON中的特殊字符进行转义
    • 使用安全的JSON库自动处理转义
  3. 安全配置

    • 禁用JSON解析器的危险特性(如外部实体解析)
    • 使用最新版本的JSON处理库

5. 检测与修复

5.1 检测方法

  1. 静态代码分析工具(如代码卫士)可检测JSON注入漏洞
  2. 手动检查JSON数据处理流程中是否存在未经验证的输入

5.2 修复步骤

  1. 识别所有接收外部JSON输入的入口点
  2. 在这些入口点实施严格的输入验证
  3. 使用安全的JSON处理库和方法
  4. 对关键业务操作增加二次验证

6. 最佳实践

  1. 永远不要信任客户端提交的JSON数据
  2. 对JSON数据进行多层防御(输入验证+输出编码)
  3. 在关键业务逻辑中使用白名单验证
  4. 定期更新JSON处理库以修复已知漏洞
  5. 在SDLC中集成JSON安全测试

通过实施这些措施,可以有效预防JSON注入漏洞,保护应用程序免受此类攻击的威胁。

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 漏洞代码示例 3.2 攻击原理 JSON通过特殊字符(引号、冒号、逗号、花括号)区分语义。当输入包含这些特殊字符时: 正常JSON: {"username":"admin","password":"adminpassword"} 恶意输入: {"username":"admin","password":"admin"password"} 其中 admin"password 中的引号会破坏JSON结构,导致解析失败或语义改变。 4. 防御措施 4.1 使用专用JSON编码器 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注入漏洞,保护应用程序免受此类攻击的威胁。