一文看懂 JSON.parse 背后的安全隱患與黑盒利用方法
一段簡單的 JSON 解析代碼,可能是一次嚴重的原型污染、提權繞過、服務癱瘓的開始。本文深入解析 JSON.parse() 的安全風險、攻擊方式,并講解如何在黑盒測試中通過數據包行為反推出后臺邏輯,為你打開攻防對抗中的新視角。
一、JSON.parse 是什么?它本身安全嗎?
JSON.parse() 是 JavaScript 原生函數,用于將字符串解析為 JavaScript 對象:
const obj = JSON.parse('{"user":"admin"}');
它本身不會執行代碼、不會像 Java 反序列化一樣觸發遠程類加載或代碼執行。
但它存在安全隱患的傳播點,關鍵在于:你如何使用解析后的對象!
二、安全風險與利用場景
風險一:原型鏈污染(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,如 |
4. 添加測試斷點 | 使用 Logger++ 插件記錄響應中的 |
如果行為生效,將獲得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)>"}
三、數據包特征分析
我們如何**在黑盒測試中識別系統內部使用了 JSON.parse()**?以下是典型思路:
特征:API 接收 JSON 格式 body
POST /api/config HTTP/1.1
Content-Type: application/json
{"username":"admin"}
判斷方式分析:
線索 | 推理 |
是否支持嵌套對象? | 是 → 可能直接 JSON.parse 解析并用于配置邏輯 |
修改特殊鍵如 | 有 → 極有可能未進行關鍵字段過濾 |
是否響應體中出現原樣字段回顯? | 是 → 可能存在配置渲染邏輯 |
是否異常響應(500 / timeout)? | 是 → 考慮 DoS 測試有效 |
組合測試:
- 提交 __proto__ → 檢查是否持久化
- 提交 constructor.prototype.polluted = true → 檢查全局污染跡象
- 利用 ["__proto__"] 數組索引寫入,繞過某些黑名單
- 使用深嵌套 JSON → 檢測解析限制
四、防御建議
安全措施 | 描述 |
輸入校驗 | 禁止解析中出現 __proto__、constructor 等關鍵字段 |
使用深拷貝庫 | 避免使用 Object.assign,推薦 structuredClone() 或安全庫 |
限制嵌套層級 | 使用庫如 json-parse-better-errors、ajv 等做層級與結構校驗 |
WAF 規則增強 | 對 JSON payload 關鍵字(如 "__proto__")做識別和阻斷 |
最小權限原則 | 后端合并配置時應隔離用戶與系統配置空間,避免全局污染 |
五、總結
項目 | 說明 |
安全點 | JSON.parse本身安全 |
風險點 | 使用方式不安全:合并配置、渲染 HTML、未校驗字段 |
探測方式 | 看輸入格式、嵌套特征、行為響應變化 |
利用策略 | 利用字段污染 → 影響權限邏輯 / 全局變量 / DoS |
防御建議 | 嚴格輸入控制 + 合理合并方式 + 安全庫使用 |