挖洞经验 | 用HTTP请求重写实现JSON CSRF
字数 1309 2025-08-15 21:30:34
JSON CSRF漏洞挖掘与利用技术详解
1. JSON CSRF漏洞概述
JSON CSRF(跨站请求伪造)是一种特殊类型的CSRF攻击,针对使用JSON格式进行数据交换的Web应用。与传统表单CSRF不同,JSON CSRF需要更复杂的技术手段来实现攻击。
1.1 漏洞产生的三个核心条件
- 基于Cookie的身份验证机制:Web应用使用Cookie进行用户身份验证
- 缺乏用户特定token保护:HTTP请求中没有包含针对用户的唯一token
- 缺乏同源策略保护:Web应用没有验证请求的来源(Origin)
2. 漏洞发现过程分析
2.1 初始请求分析
原始PUT请求特征:
- 使用PUT方法
- 包含
X-Auth-Token头(用户特定token) - 验证Origin头
2.2 测试方法
-
请求方法变更测试:
- 将PUT方法改为GET
- 添加参数作为请求参数
-
请求头删除测试:
- 删除
X-Auth-Token头 - 删除其他验证头信息
- 删除
-
Token替换测试:
- 使用相同长度但不同值的Token进行验证
2.3 关键发现
- 删除
X-Auth-Token头后,后端仍能正常响应 - 虽然存在Token头验证漏洞,但PUT方法和Origin验证限制了利用
3. 绕过技术详解
3.1 方法重写技术
-
方法变更测试:
- 将PUT改为POST方法
- 删除Origin头
-
方法重写参数:
- 在POST请求中添加
_method=PUT参数 - 示例URL:
https://<vulnerable-url>?_method=PUT
- 在POST请求中添加
3.2 请求构造技巧
- 使用
enctype="text/plain"属性 - 巧妙构造输入字段名和值来生成有效的JSON负载
4. PoC代码分析
<body onload='document.forms[0].submit()'>
<form action="https://<vulnerable-url>?_method=PUT" method="POST" enctype="text/plain">
<input type="text" name='{"username":"blob","dummy":"' value='"}'>
<input type="submit" value="send">
</form>
4.1 PoC工作原理
- 表单提交时自动触发(通过
onload事件) - 使用POST方法但通过
_method=PUT参数重写为PUT方法 - 通过特殊构造的输入字段生成JSON格式请求体:
{"username":"blob", "dummy":"}
5. 漏洞根本原因
-
不安全的Token验证机制:
- 后端没有强制验证
X-Auth-Token头 - Token验证存在逻辑缺陷
- 后端没有强制验证
-
不严格的请求头验证:
- Origin验证可以被绕过
- 方法重写功能缺乏安全限制
6. 防御建议
-
强制Token验证:
- 对所有敏感操作强制验证CSRF token
- Token应绑定到用户会话
-
严格方法验证:
- 禁止通过参数重写HTTP方法
- 明确允许的方法列表
-
加强Origin验证:
- 严格验证Origin和Referer头
- 实现同源策略检查
-
内容类型限制:
- 对JSON请求强制要求
Content-Type: application/json - 拒绝
text/plain类型的JSON请求
- 对JSON请求强制要求
7. 测试技巧总结
-
请求变形测试:
- 方法变更(PUT↔POST↔GET)
- 参数位置变化(URL↔Body↔Header)
-
头信息操作:
- 删除安全相关头信息
- 修改头信息值
-
内容类型测试:
- 尝试不同的Content-Type
- 测试非常规的enctype
-
参数重写测试:
- 尝试通过参数重写方法(如
_method) - 测试框架特定的重写机制
- 尝试通过参数重写方法(如