挖洞经验 | 用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 漏洞产生的三个核心条件

  1. 基于Cookie的身份验证机制:Web应用使用Cookie进行用户身份验证
  2. 缺乏用户特定token保护:HTTP请求中没有包含针对用户的唯一token
  3. 缺乏同源策略保护:Web应用没有验证请求的来源(Origin)

2. 漏洞发现过程分析

2.1 初始请求分析

原始PUT请求特征:

  • 使用PUT方法
  • 包含X-Auth-Token头(用户特定token)
  • 验证Origin头

2.2 测试方法

  1. 请求方法变更测试

    • 将PUT方法改为GET
    • 添加参数作为请求参数
  2. 请求头删除测试

    • 删除X-Auth-Token
    • 删除其他验证头信息
  3. Token替换测试

    • 使用相同长度但不同值的Token进行验证

2.3 关键发现

  • 删除X-Auth-Token头后,后端仍能正常响应
  • 虽然存在Token头验证漏洞,但PUT方法和Origin验证限制了利用

3. 绕过技术详解

3.1 方法重写技术

  1. 方法变更测试

    • 将PUT改为POST方法
    • 删除Origin头
  2. 方法重写参数

    • 在POST请求中添加_method=PUT参数
    • 示例URL:https://<vulnerable-url>?_method=PUT

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工作原理

  1. 表单提交时自动触发(通过onload事件)
  2. 使用POST方法但通过_method=PUT参数重写为PUT方法
  3. 通过特殊构造的输入字段生成JSON格式请求体:
    {"username":"blob", "dummy":"}
    

5. 漏洞根本原因

  1. 不安全的Token验证机制

    • 后端没有强制验证X-Auth-Token
    • Token验证存在逻辑缺陷
  2. 不严格的请求头验证

    • Origin验证可以被绕过
    • 方法重写功能缺乏安全限制

6. 防御建议

  1. 强制Token验证

    • 对所有敏感操作强制验证CSRF token
    • Token应绑定到用户会话
  2. 严格方法验证

    • 禁止通过参数重写HTTP方法
    • 明确允许的方法列表
  3. 加强Origin验证

    • 严格验证Origin和Referer头
    • 实现同源策略检查
  4. 内容类型限制

    • 对JSON请求强制要求Content-Type: application/json
    • 拒绝text/plain类型的JSON请求

7. 测试技巧总结

  1. 请求变形测试

    • 方法变更(PUT↔POST↔GET)
    • 参数位置变化(URL↔Body↔Header)
  2. 头信息操作

    • 删除安全相关头信息
    • 修改头信息值
  3. 内容类型测试

    • 尝试不同的Content-Type
    • 测试非常规的enctype
  4. 参数重写测试

    • 尝试通过参数重写方法(如_method
    • 测试框架特定的重写机制
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 3.2 请求构造技巧 使用 enctype="text/plain" 属性 巧妙构造输入字段名和值来生成有效的JSON负载 4. PoC代码分析 4.1 PoC工作原理 表单提交时自动触发(通过 onload 事件) 使用POST方法但通过 _method=PUT 参数重写为PUT方法 通过特殊构造的输入字段生成JSON格式请求体: 5. 漏洞根本原因 不安全的Token验证机制 : 后端没有强制验证 X-Auth-Token 头 Token验证存在逻辑缺陷 不严格的请求头验证 : Origin验证可以被绕过 方法重写功能缺乏安全限制 6. 防御建议 强制Token验证 : 对所有敏感操作强制验证CSRF token Token应绑定到用户会话 严格方法验证 : 禁止通过参数重写HTTP方法 明确允许的方法列表 加强Origin验证 : 严格验证Origin和Referer头 实现同源策略检查 内容类型限制 : 对JSON请求强制要求 Content-Type: application/json 拒绝 text/plain 类型的JSON请求 7. 测试技巧总结 请求变形测试 : 方法变更(PUT↔POST↔GET) 参数位置变化(URL↔Body↔Header) 头信息操作 : 删除安全相关头信息 修改头信息值 内容类型测试 : 尝试不同的Content-Type 测试非常规的enctype 参数重写测试 : 尝试通过参数重写方法(如 _method ) 测试框架特定的重写机制