跨站请求伪造(CSRF)攻击的变异形式:JSON CSRF详解
字数 1279 2025-12-05 02:47:16

跨站请求伪造(CSRF)攻击的变异形式:JSON CSRF详解

1. 问题描述

JSON CSRF是CSRF攻击的一种变异形式,攻击者诱导用户浏览器向目标Web应用发送恶意请求,但请求体为JSON格式(而非传统的表单格式)。由于部分开发者错误地认为JSON请求不会受到CSRF攻击(误以为需要显式设置Content-Type: application/json即可免疫),导致防护措施缺失,从而引发安全漏洞。

2. JSON CSRF的攻击原理

2.1 传统CSRF的局限性

  • 传统CSRF通常依赖自动提交表单或触发GET请求,请求体格式为application/x-www-form-urlencoded
  • 浏览器同源策略(SOP)允许跨域发送请求,但会拦截跨域读取响应(除非CORS允许)。因此,攻击者可构造恶意页面,利用用户已登录的会话发起伪造请求。

2.2 JSON CSRF的突破点

  • 部分API接口使用JSON格式传输数据,且未正确验证请求来源(如仅依赖Cookie认证)。
  • 攻击者通过JavaScript发起跨域POST请求时,浏览器会先发送预检请求(Preflight)(若请求方法或头部非简单请求)。但某些条件下(如使用<form>标签或特定技巧),可绕过预检机制直接发送JSON数据。

3. 攻击场景与条件

3.1 必要条件

  1. 目标接口接受JSON格式的请求体(例如Content-Type: application/json)。
  2. 接口仅依赖Cookie或Session进行身份验证,未校验CSRF Token、Origin头或Referer头。
  3. 浏览器允许跨域发送请求(尽管响应可能被SOP拦截,但请求仍可能被服务器处理)。

3.2 攻击示例

假设用户已登录https://bank.com,其转账接口如下:

POST /transfer HTTP/1.1
Host: bank.com
Content-Type: application/json
Cookie: sessionid=user_session_token

{"amount": 1000, "to_account": "attacker_account"}

攻击者构造恶意页面,通过自动提交表单模拟JSON请求:

<form action="https://bank.com/transfer" method="POST" enctype="text/plain">
  <input name='{"amount": 1000, "to_account": "attacker_account", "ignore":"' value='test"}' type="hidden">
</form>
<script>document.forms[0].submit();</script>

表单的enctype="text/plain"会将输入框内容拼接为纯文本,最终请求体为:

{"amount": 1000, "to_account": "attacker_account", "ignore":"=test"}

服务器若未严格解析JSON(如容忍多余字段),可能执行转账操作。

4. 防御措施

4.1 严格验证请求来源

  • 检查Origin头或Referer头,确保请求来自可信域名。
  • 禁用通配符(*)的CORS配置,避免跨域请求被滥用。

4.2 引入CSRF Token

  • 在JSON请求体中嵌入CSRF Token(由服务器生成并验证),且Token不应通过Cookie传输。
  • 示例:
{"amount": 1000, "to_account": "attacker_account", "csrf_token": "random_secret_value"}

4.3 强制预检请求

  • 确保非简单请求(如Content-Type: application/json)必须经过预检,从而阻止跨域表单直接提交JSON。
  • 服务器可拒绝未通过预检的请求。

4.4 双重认证机制

  • 对敏感操作要求二次验证(如短信验证码、重新输入密码)。

5. 总结

JSON CSRF利用了开发者对JSON请求的安全误解,通过跨域表单或特定技巧绕过传统防护。防御需结合请求来源验证、CSRF Token及预检机制,确保即使请求格式变化,身份验证逻辑仍不可绕过。

跨站请求伪造(CSRF)攻击的变异形式:JSON CSRF详解 1. 问题描述 JSON CSRF是CSRF攻击的一种变异形式,攻击者诱导用户浏览器向目标Web应用发送恶意请求,但请求体为JSON格式(而非传统的表单格式)。由于部分开发者错误地认为JSON请求不会受到CSRF攻击(误以为需要显式设置 Content-Type: application/json 即可免疫),导致防护措施缺失,从而引发安全漏洞。 2. JSON CSRF的攻击原理 2.1 传统CSRF的局限性 传统CSRF通常依赖自动提交表单或触发GET请求,请求体格式为 application/x-www-form-urlencoded 。 浏览器同源策略(SOP)允许跨域发送请求,但会拦截跨域读取响应(除非CORS允许)。因此,攻击者可构造恶意页面,利用用户已登录的会话发起伪造请求。 2.2 JSON CSRF的突破点 部分API接口使用JSON格式传输数据,且未正确验证请求来源(如仅依赖Cookie认证)。 攻击者通过JavaScript发起跨域POST请求时,浏览器会先发送 预检请求(Preflight) (若请求方法或头部非简单请求)。但某些条件下(如使用 <form> 标签或特定技巧),可绕过预检机制直接发送JSON数据。 3. 攻击场景与条件 3.1 必要条件 目标接口接受JSON格式的请求体(例如 Content-Type: application/json )。 接口仅依赖Cookie或Session进行身份验证,未校验CSRF Token、Origin头或Referer头。 浏览器允许跨域发送请求(尽管响应可能被SOP拦截,但请求仍可能被服务器处理)。 3.2 攻击示例 假设用户已登录 https://bank.com ,其转账接口如下: 攻击者构造恶意页面,通过自动提交表单模拟JSON请求: 表单的 enctype="text/plain" 会将输入框内容拼接为纯文本,最终请求体为: 服务器若未严格解析JSON(如容忍多余字段),可能执行转账操作。 4. 防御措施 4.1 严格验证请求来源 检查 Origin 头或 Referer 头,确保请求来自可信域名。 禁用通配符( * )的CORS配置,避免跨域请求被滥用。 4.2 引入CSRF Token 在JSON请求体中嵌入CSRF Token(由服务器生成并验证),且Token不应通过Cookie传输。 示例: 4.3 强制预检请求 确保非简单请求(如 Content-Type: application/json )必须经过预检,从而阻止跨域表单直接提交JSON。 服务器可拒绝未通过预检的请求。 4.4 双重认证机制 对敏感操作要求二次验证(如短信验证码、重新输入密码)。 5. 总结 JSON CSRF利用了开发者对JSON请求的安全误解,通过跨域表单或特定技巧绕过传统防护。防御需结合请求来源验证、CSRF Token及预检机制,确保即使请求格式变化,身份验证逻辑仍不可绕过。