跨站请求伪造(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 必要条件
- 目标接口接受JSON格式的请求体(例如
Content-Type: application/json)。 - 接口仅依赖Cookie或Session进行身份验证,未校验CSRF Token、Origin头或Referer头。
- 浏览器允许跨域发送请求(尽管响应可能被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及预检机制,确保即使请求格式变化,身份验证逻辑仍不可绕过。