JSON漏洞利用:从原理到实战攻防解析
JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简洁、易读、易解析的特性,已成为Web开发中前后端数据交互的核心格式,随着JSON的广泛应用,其相关的安全漏洞也逐渐成为攻击者的突破口,从服务端数据泄露到客户端代码执行,JSON漏洞的利用方式多样,危害程度不一,本文将剖析JSON漏洞的核心类型、利用原理及实战攻防方案,帮助开发者理解风险并构建有效的防御体系。
JSON漏洞的核心类型与利用原理
JSON漏洞的本质多源于“数据与代码的边界模糊”——当应用程序将JSON数据错误地解析为可执行代码,或未对JSON数据进行严格校验导致越权操作时,漏洞便会产生,以下是几种常见的JSON漏洞类型及其利用逻辑。
JSON注入:从数据篡改到代码执行
漏洞原理
JSON注入的核心原因是应用程序将用户输入直接拼接到JSON响应中,未进行转义或过滤,导致攻击者可以构造恶意的JSON结构,破坏原有数据的语义。
利用场景
案例1:服务端逻辑绕过
假设某登录接口的响应格式为:
{"status": "success", "user": "admin", "role": "admin"}
若应用程序将用户输入的role参数直接拼接到响应中,攻击者提交"role": "admin", "is_admin": true作为JSON值,最终响应可能变为:
{"status": "success", "user": "admin", "role": "admin", "is_admin": true}
若服务端依赖role字段判断权限,攻击者可能通过篡改字段提升权限。
案例2:客户端代码执行(JSON hijacking)
在早期JavaScript中,若使用<script>标签直接解析JSON响应(如<script src="api/data?callback=parseData"></script>),攻击者可构造恶意JSON:
[{"name": "attacker", "data": (function(){ stealCookies(); })()}]
当浏览器执行该JSON时,其中的函数会被调用,导致Cookie等敏感信息泄露。
防御措施
- 对用户输入进行严格的转义(如使用
JSON.stringify()对输出字段进行编码); - 避免动态拼接JSON,采用结构化序列化方式;
- 禁止使用
<script>标签直接解析JSON,改用XMLHttpRequest或fetch等API。
XXE(XML External Entity)注入:JSON解析中的“伪装者”
漏洞原理
虽然JSON本身不支持XXE,但部分应用在处理JSON数据时,会将其转换为XML(如通过json2xml库),若转换过程未禁用外部实体(DTD),则可能触发XXE注入。
利用场景
假设应用将JSON请求{"user": "admin", "entity": "SYSTEM 'file:///etc/passwd'"}转换为XML:
<user>admin</user> <entity>&SYSTEM 'file:///etc/passwd'</entity>
若解析器未禁用外部实体,攻击者可通过file://、http://等协议读取服务器敏感文件,或利用expect://执行系统命令。
防御措施
- 避免在JSON处理链中引入不安全的XML转换;
- 若必须转换,确保禁用DTD、外部实体解析(如设置
feature_SECURE_PROCESSING); - 使用安全的JSON解析库,避免依赖第三方有漏洞的转换工具。
反序列化漏洞:JSON数据的“特洛伊木马”
漏洞原理
部分编程语言(如Python、Java)的JSON解析库支持反序列化复杂对象(如自定义类),若应用对反序列化的对象类型未做校验,攻击者可构造恶意数据,触发任意代码执行。
利用场景
Python示例:通过__reduce__执行命令
假设应用使用json.loads()解析用户提交的数据,且目标环境存在pickle库(可通过__reduce__触发命令执行):
import json
import pickle
malicious_json = '{"__reduce__": ["exec", ("import os; os.system(''whoami'')",)]}'
data = json.loads(malicious_json) # 若反序列化时调用pickle,则触发命令执行
Java示例:通过Class加载恶意类
若应用使用Jackson或Gson库反序列化JSON,攻击者可构造指向恶意类的JSON字段,利用ClassLoader加载并执行代码。
防御措施
- 禁止反序列化不可信的复杂对象,仅处理基础数据类型(字符串、数字、布尔值等);
- 使用安全的反序列化库(如限制可加载的类白名单);
- 对输入数据进行严格校验,拒绝包含特殊字段(如
__reduce__、@type)的JSON。
信息泄露:JSON元数据中的“敏感拼图”
漏洞原理
部分应用在返回JSON时,会无意中包含调试信息、配置细节或内部结构(如堆栈跟踪、数据库字段名),攻击者可利用这些信息推断系统架构,进一步发起攻击。
利用场景
- 错误响应泄露信息:如
{"error": "Column 'password' not found in table", "query": "SELECT * FROM users WHERE id=1"}; - 调试模式泄露API结构:如
{"debug": {"endpoints": ["/admin", "/api/v1/internal"]}, "data": {...}}; - 注释中的敏感信息:如
{"user": "admin", /* "password": "5f4dcc3b5aa765d61d8327deb882cf99" */}。
利用步骤
- 收集泄露的API端点、字段名、错误信息;
- 结合字典枚举(如目录爆破、字段爆破)定位敏感数据;
- 利用泄露的配置信息(如数据库类型、加密方式)构造针对性攻击。
防御措施
- 生产环境关闭调试模式,统一错误处理,避免返回堆栈信息;
- 移除JSON中的注释和调试字段;
- 对敏感字段名(如
password、token)进行脱敏或重命名。
JSON Schema绕过:数据校验的“形同虚设”
漏洞原理
部分应用通过JSON Schema校验请求数据的格式,若Schema定义存在漏洞(如允许未知字段、类型校验不严格),攻击者可构造恶意数据绕过校验。
利用场景
假设Schema要求{"username": "string", "password": "string"},但未设置additionalProperties: false,攻击者可提交:
{"username": "admin", "password": "123456", "is_admin": true}
若服务端仅依赖Schema校验,未二次校验is_admin字段,可能导致越权操作。
防御措施
- 在JSON Schema中明确设置
additionalProperties: false,禁止未知字段; - 对关键字段(如权限标识)进行二次校验,不仅依赖Schema格式;
- 使用严格的Schema校验库(如
ajv),确保类型、长度、格式等约束生效。
JSON漏洞实战利用案例
案例1:某Web应用JSON注入导致权限提升
目标:获取管理员权限
步骤:
- 构造恶意JSON数据:
{"username": "attacker", "role": "user", "permissions": ["read"], "is_admin": true}; - 通过修改HTTP请求参数(如修改表单的
role字段值为上述JSON),提交至用户信息更新接口; - 服务端未对输入进行转义,直接将
is_admin: true拼接到JSON响应中; - 后续权限校验逻辑依赖
is_admin字段,攻击者成功获取管理员权限。
防御:对用户输入进行JSON转义,避免动态拼接响应。
案例2:Python应用JSON反序列化命令执行
目标:远程执行系统命令
步骤:
- 利用
__reduce__构造恶意JSON:{"cmd": "__reduce__", "value": ["exec", ("ls -la /",)]}; - 通过API提交该JSON,应用使用
json.loads()解析,并尝试反序列化为对象; - 若应用环境存在
pickle库且未禁用,触发exec("ls -la /"),返回目录列表。
防御:禁止反序列化包含特殊字段的JSON,或使用safe_load替代load。



还没有评论,来说两句吧...