一文看懂 JSON.parse 背后的安全隐患与黑盒利用方法
🔍 一段简单的 JSON 解析代码,可能是一次严重的原型污染、提权绕过、服务瘫痪的开始。本文深入解析
JSON.parse()
的安全风险、攻击方式,并讲解如何在黑盒测试中通过数据包行为反推出后台逻辑,为你打开攻防对抗中的新视角。
📌 1. JSON.parse 是什么?它本身安全吗?
JSON.parse()
是 JavaScript 原生函数,用于将字符串解析为 JavaScript 对象:
const obj = JSON.parse('{"user":"admin"}');
✅ 它本身不会执行代码、不会像 Java 反序列化一样触发远程类加载或代码执行。 ❗️但它存在安全隐患的传播点,关键在于:你如何使用解析后的对象!
🔥 2. 典型安全风险与利用场景
✅ 风险一:原型链污染(Prototype Pollution)
关键字段如
__proto__
/constructor
/prototype
被写入对象中,通过合并操作传播到所有对象。
🧪 利用前提:
- 后端用
Object.assign
、lodash.merge
等合并用户传参与默认配置。 - 没有进行关键字段过滤。
📦 典型 payload:
{
"__proto__": {
"admin": true
}
}
💥 后果示例:
const config = Object.assign({}, defaultConfig, JSON.parse(userInput));
// 之后任何 new Object() 都可能带上 admin: true
📦 常见数据包格式
POST /api/profile HTTP/1.1
Host: target.example.com
Content-Type: application/json
Content-Length: 70
{
"__proto__": {
"isAdmin": true
}
}
✅ Burp 分析方法:
步骤 | 观察点 |
---|---|
1. 请求发出 | 目标接口是否处理 JSON 格式数据 |
2. 重复访问其他接口 | 是否行为改变(权限 / 响应内容) |
3. Proxy + Repeater | 逐步调整 payload,如 ["__proto__"] |
4. 添加测试断点 | 使用 Logger++ 插件记录响应中的 isAdmin 等字段是否被反映 |
如果行为生效,将获得Admin权限,页面菜单等权限将有明显改变
✅ 风险二:拒绝服务攻击(Billion Laughs / Deep Nesting DoS)
{
"a":{"a":{"a":{"a":{"a":{"a":{"a":{"a":{"a":{"a":{}}}}}}}}}}
}
- 重复嵌套结构触发 CPU 暴涨或内存崩溃。
- 常用于前期探测、WAF 绕过测试。
✅ 风险三:DOM-Based XSS(前端使用不当)
如果前端用 innerHTML
或 document.write
直接渲染 JSON 解析的字段:
const data = JSON.parse(payload);
document.body.innerHTML = data.content;
攻击者构造:
{"content": "<img src=x onerror=alert(1)>"}
🧠 3. 数据包特征分析
我们如何在黑盒测试中识别系统内部使用了 JSON.parse()
?以下是典型思路:
🧩 特征:API 接收 JSON 格式 body
POST /api/config HTTP/1.1
Content-Type: application/json
{"username":"admin"}
📍 判断方式分析:
线索 | 推理 |
---|---|
是否支持嵌套对象? | 是 → 可能直接 JSON.parse 解析并用于配置逻辑 |
修改特殊键如 __proto__ 有无响应变化? | 有 → 极有可能未进行关键字段过滤 |
是否响应体中出现原样字段回显? | 是 → 可能存在配置渲染逻辑 |
是否异常响应(500 / timeout)? | 是 → 考虑 DoS 测试有效 |
🛠️ 组合测试
- 提交
__proto__
→ 检查是否持久化 - 提交
constructor.prototype.polluted = true
→ 检查全局污染迹象 - 利用
["__proto__"]
数组索引写入,绕过某些黑名单 - 使用深嵌套 JSON → 检测解析限制
🧯 4. 防御建议
安全措施 | 描述 |
---|---|
输入校验 | 禁止解析中出现 __proto__ 、constructor 等关键字段 |
使用深拷贝库 | 避免使用 Object.assign ,推荐 structuredClone() 或安全库 |
限制嵌套层级 | 使用库如 json-parse-better-errors 、ajv 等做层级与结构校验 |
WAF 规则增强 | 对 JSON payload 关键字 (如 "__proto__" )做识别和阻断 |
最小权限原则 | 后端合并配置时应隔离用户与系统配置空间 ,避免全局污染 |
✅ 总结
项目 | 说明 |
---|---|
安全点 | JSON.parse 本身安全 |
风险点 | 使用方式不安全:合并配置、渲染 HTML、未校验字段 |
探测方式 | 看输入格式、嵌套特征、行为响应变化 |
利用策略 | 利用字段污染 → 影响权限逻辑 / 全局变量 / DoS |
防御建议 | 严格输入控制 + 合理合并方式 + 安全库使用 |
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容