跨站请求伪造(CSRF)攻击的变异形式:JSON CSRF详解
字数 1449 2025-12-04 11:36:34
跨站请求伪造(CSRF)攻击的变异形式:JSON CSRF详解
1. 问题描述
JSON CSRF(跨站请求伪造)是一种针对使用JSON格式传输数据的Web应用的攻击变种。传统CSRF攻击通常依赖表单自动提交或GET请求,而JSON CSRF则利用浏览器对JSON请求的处理特性,绕过部分防御机制(如基于表单Token的验证),实现未授权操作。
2. 攻击原理
2.1 传统CSRF的局限性
- 传统防御依赖CSRF Token或验证Referer头。
- 若应用仅检查Content-Type为
application/json但未验证Token,攻击者可能通过构造特定请求绕过防御。
2.2 JSON CSRF的攻击条件
- 目标接口使用JSON格式接收数据(如RESTful API)。
- 服务端未严格验证请求来源(如忽略CSRF Token)或允许简单请求(CORS配置宽松)。
- 攻击者可诱导用户访问恶意页面,自动发送JSON格式的恶意请求。
3. 攻击步骤详解
3.1 构造恶意JSON请求
假设目标接口为https://api.example.com/transfer,接受JSON数据:
{"to": "attacker", "amount": 1000}
攻击者需在恶意页面中通过JavaScript发送POST请求:
<script>
fetch('https://api.example.com/transfer', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ "to": "attacker", "amount": 1000 })
});
</script>
3.2 绕过防御的常见技巧
- 利用CORS宽松配置:若服务端响应头包含
Access-Control-Allow-Origin: *,攻击页面可直接获取响应数据。 - 使用自动发送的简单请求:通过
<form>或<img>标签触发请求,但需服务端接受text/plain或未校验Content-Type。 - 结合XSS或中间人攻击:若存在XSS漏洞,可直接注入脚本发送JSON请求。
4. 防御措施
4.1 服务端关键防护
-
强制验证CSRF Token:
- 将Token嵌入JSON体(如
{ "csrf_token": "xxx", ... })而非仅依赖Cookie。 - 避免依赖Referer头(可能被篡改或缺失)。
- 将Token嵌入JSON体(如
-
严格检查Content-Type:
- 要求请求头必须为
application/json,并拒绝text/plain或application/x-www-form-urlencoded。
- 要求请求头必须为
-
CORS策略限制:
- 禁止使用
Access-Control-Allow-Origin: *,仅允许可信域名。 - 预检请求(Preflight)需验证方法(POST/PUT)和头部(Content-Type)。
- 禁止使用
4.2 客户端辅助防护
- 关键操作需二次认证(如短信验证码、重新输入密码)。
- 使用SameSite Cookie属性(Strict/Lax模式)限制跨站Cookie携带。
5. 实例分析
假设某银行API仅通过Cookie验证会话,且未校验CSRF Token:
- 攻击者搭建恶意网站,嵌入上述Fetch代码。
- 用户登录银行后访问恶意网站,浏览器自动携带Cookie发送转账请求。
- 服务端误认为合法操作,执行转账。
修复方案:
- 在JSON请求体中添加动态CSRF Token,服务端校验Token与会话绑定关系。
- 配置CORS仅允许银行域名,并启用预检请求拦截跨域非法访问。
6. 总结
JSON CSRF通过滥用JSON接口的宽松安全策略,绕过传统表单类CSRF防御。防护核心在于服务端严格校验请求来源、强制使用Token,并配合CORS策略与SameSite Cookie,形成多层防御体系。