第 6 章 · 02 跨站请求伪造(CSRF)


文档摘要

第 6 章 · 02 跨站请求伪造(CSRF) 本节摘要:跨站请求伪造(CSRF)滥用的是「环境凭据」(cookie、HTTP 认证)在跨源请求中仍被携带这一事实——攻击者不需要偷 token,只要让受害者已登录的浏览器替自己发请求。它不靠 payload,靠的是「服务器分不清请求是谁发起的」。本节讲透攻击面(哪些会话模型易感、哪些是高价值目标)、侦察(cookie 的 SameSite/HttpOnly/Secure、token 与 Origin/Referer 校验、方法与 content-type、CORS 配置)、关键漏洞形态(导航 CSRF、简单 content-type CSRF、JSON CSRF、登录/注销

第 6 章 · 02 跨站请求伪造(CSRF)

本节摘要:跨站请求伪造(CSRF)滥用的是「环境凭据」(cookie、HTTP 认证)在跨源请求中仍被携带这一事实——攻击者不需要偷 token,只要让受害者已登录的浏览器替自己发请求。它不靠 payload,靠的是「服务器分不清请求是谁发起的」。本节讲透攻击面(哪些会话模型易感、哪些是高价值目标)、侦察(cookie 的 SameSite/HttpOnly/Secure、token 与 Origin/Referer 校验、方法与 content-type、CORS 配置)、关键漏洞形态(导航 CSRF、简单 content-type CSRF、JSON CSRF、登录/注销 CSRF、OAuth/OIDC、文件与动作端点、GraphQL、WebSocket CSRF)、绕过技巧(SameSite 细微差异、Origin/Referer 混淆、方法覆写、token 弱点、content-type 切换、头部操纵)以及与 IDOR/Clickjacking/OAuth mix-up 的链式攻击。CSRF 只有在「状态变更需要一个攻击者无法提供的秘密、且服务器验证调用方来源」时才算被消除。

内容来源:原项目知识包 strix/skills/vulnerabilities/csrf.md,汉化并套用体系化模板。

⚠️ 仅限授权测试:本节所有 payload 与技术仅用于你自己的应用或有书面授权的渗透测试。未经授权对他人系统使用这些技术是非法的。

学习目标

阅读完本节,你应当能够:

  1. 识别 CSRF 的典型攻击面(易感会话模型、高价值目标端点)。
  2. 完成 CSRF 侦察:cookie 属性、token/头部校验、方法与 content-type、CORS 配置。
  3. 复现关键漏洞形态:导航 CSRF、简单 content-type CSRF、JSON CSRF、登录/注销 CSRF、OAuth/OIDC、文件/动作端点、GraphQL、WebSocket CSRF。
  4. 掌握绕过技巧:SameSite 细微差异、Origin/Referer 混淆、方法覆写、token 弱点、content-type 切换。
  5. 把 CSRF 与 IDOR、Clickjacking、OAuth mix-up 链式放大影响。
  6. 用验证步骤确认漏洞、排除误报
  7. 评估 CSRF 的影响等级

一、攻击面

易感的会话模型:

  • 基于 cookie 的会话与 HTTP 认证(Web 应用)。
  • JSON/REST、GraphQL(GET 与持久化查询)、文件上传端点。

仅用 Authorization 头或 bearer token 的纯 SPA 通常不易感;但 cookie 与 API 混用的混合应用仍可能中招。CORS 配置宽松不是 CSRF 的修复,反而可能把 CSRF 变成数据外带。

认证流程:登录/注销、密码/邮箱/手机号修改、MFA 开关;OAuth/OIDC 的 authorize、token、logout、connect/disconnect 端点。

高价值目标(状态变更类):

  • 凭据与资料变更(邮箱/密码/手机号)。
  • 支付与资金转移、订阅/套餐变更。
  • API key/secret 生成、PAT 轮换、SSH key。
  • 2FA/TOTP 启停、备份码、设备信任。
  • OAuth connect/disconnect、注销、账户删除。
  • 管理员/员工动作与模拟(impersonation)流程。
  • 文件上传/删除、访问控制变更。

💡 核心心法:CSRF 的本质是「服务器为攻击者执行了状态变更,因为浏览器自动带上了受害者的环境凭据」。判断一个端点是否易感,关键看它是否依赖 cookie/HTTP 认证、是否要求一个攻击者无法提供的秘密、是否校验来源

二、检测通道(侦察)

CSRF 的「检测」是一组侦察动作,用来判断防线是否到位。

  • 检查 cookie 属性:HttpOnlySecureSameSite(Strict/Lax/None)。
  • Lax顶层跨站 GET 时仍带 cookie;None 必须配 Secure
  • 判断用的是 Authorization 头/bearer token(通常不易感)还是 cookie(易感)。

token 与头部校验

  • 定位 anti-CSRF token(隐藏 input、meta 标签、自定义头)。
  • 移除 token、跨请求复用、跨会话复用、与方法/路径的绑定。
  • 验证服务器在状态变更时是否校验 Origin 和/或 Referer
  • 测 null/缺失与跨源值。

方法与 content-type

  • 确认 GET/HEAD/OPTIONS 是否会执行状态变更。
  • 尝试简单 content-type 以避免预检(preflight):application/x-www-form-urlencodedmultipart/form-datatext/plain
  • 探测把 text/plain 或表单编码 body 自动强转成 JSON 的解析器。

CORS 配置

  • 识别 Access-Control-Allow-Origin-Credentials
  • 宽松 CORS 不是 CSRF 的修复,反而能把 CSRF 变成数据外带。
  • 测每端点的 CORS 差异;预检与简单请求的行为可能分叉。

三、利用方法与技术

导航 CSRF

自动提交指向目标源的表单;在「cookie 被发送且无 token/来源校验」时奏效。顶层 GET 导航在服务器误用 GET、或把动作链接到 GET 回调时,可触发状态变更。

简单 content-type CSRF

  • application/x-www-form-urlencodedmultipart/form-data 的 POST 不需要预检
  • text/plain 的表单 body 可绕过校验器,并在服务端被解析。

JSON CSRF

  • 若服务器从 text/plain 或表单编码 body 解析 JSON,可构造参数重组 JSON。
  • 部分框架接受表单字段形式的 JSON 键(如 data[foo]=bar),或对重复键宽松处理。

登录/注销 CSRF

  • 强制注销以清掉 CSRF token,再链式登录 CSRF,把受害者绑定到攻击者账户。
  • 登录 CSRF:向受害者浏览器提交攻击者凭据;后续动作都发生在攻击者账户下(可借此收集受害者的输入数据)。

OAuth/OIDC 流程

  • 滥用可通过 GET 或表单 POST 触达、且无来源校验的 authorize/logout 端点。
  • 利用顶层导航上宽松的 SameSite。
  • 开放重定向或宽松的 redirect_uri 校验可与 CSRF 链式,强制非预期授权。

文件与动作端点

  • 文件上传/删除常缺 token 校验;伪造 multipart 请求修改存储。
  • 暴露为简单 POST 链接的管理员动作,常可被 CSRF。

GraphQL CSRF

  • 若查询/变更可通过 GET 或持久化查询发起,利用顶层导航携带编码后的载荷。
  • 批量操作可能把变更藏在「看似安全」的请求里。

WebSocket CSRF

  • 浏览器在 WebSocket 握手时发送 cookie。
  • 服务器必须做 Origin 校验;否则跨站页面可打开已认证的 socket 并下发动作。

四、绕过技巧

SameSite 细微差异

  • 默认 Lax 的 cookie 在顶层跨站 GET 时发送,但 POST 不发送。
  • 利用 GET 状态变更与基于 GET 的确认步骤。
  • 旧版或非标准客户端可能忽略 SameSite;跨浏览器/设备验证。

Origin/Referer 混淆

  • sandbox/iframe 可产生 null Origin;部分框架错误地接受 null。
  • about:blank/data: URL 会改变 Referer。
  • 确保服务器要求显式 Origin/Referer 匹配。

方法覆写

  • 后端若尊重 _methodX-HTTP-Method-Override,可能让一个简单 POST 触发破坏性动作。

token 弱点

  • 接受缺失/空 token。
  • token 不与会话/用户/路径绑定。
  • token 无限复用;token 出现在 GET 中。
  • 双提交 cookie 缺 Secure/HttpOnly,或 token 来源可预测。

content-type 切换

  • 在 form、multipart、text/plain 之间切换以命中不同代码路径。
  • 用重复键与数组形态扰乱解析器。

头部操纵

  • 经 meta refresh 或从 about:blank 导航剥掉 Referer。
  • 测 null Origin 接受。
  • 利用配置错误的 CORS 加入自定义头,让服务器误当作 CSRF token。

五、验证与误报排除

确认一个 CSRF 真实存在的稳妥步骤:

  1. 演示跨源触发:给出一个跨源页面,在用户仅访问的情况下触发状态变更(无需其他交互)。
  2. 证明防线失效:移除 anti-CSRF 控制(token/头)被接受,或 Origin/Referer 未被验证。
  3. 跨上下文:至少两种浏览器或上下文(顶层导航 vs XHR/fetch)证明行为一致。
  4. 前后状态证据:对同一账户给出前后状态证据。
  5. 绕过条件:若存在防线,给出被绕过的确切条件(content-type、方法覆写、null Origin)。

常见误报:

  • token 校验存在且必需;Origin/Referer 一致地强制。
  • 跨站请求不带 cookie(SameSite=Strict,无 HTTP 认证),且简单请求不会触发状态变更。
  • 仅影响幂等、非敏感操作。

六、影响评估

  • 账户状态变更:邮箱/密码/MFA;经登录 CSRF 实现会话劫持。
  • 金融操作:转账、退款、订阅;管理员动作。
  • 持久授权变更:角色/权限翻转、密钥轮换;数据丢失。

⚠️ CSRF 的影响取决于被劫持端点的业务语义。能改密码/邮箱/MFA 的 CSRF 等同于账户接管;能触发支付/退款的 CSRF 等同于直接资金损失。

本节要点回顾

  1. 核心心法:CSF 滥用环境凭据(cookie/HTTP 认证)在跨源请求中自动携带;只有「状态变更需要一个攻击者无法提供的秘密 + 服务器验证来源」时才算消除。
  2. 易感会话模型:cookie 会话、HTTP 认证;纯 bearer token 的 SPA 不易感,但混合应用仍可中招;宽松 CORS 不是修复。
  3. 高价值目标:凭据/资料变更、支付/资金、API key、2FA、OAuth connect/disconnect、注销/删除、管理员动作、文件操作。
  4. 侦察四组:cookie 属性(SameSite/HttpOnly/Secure)、token/头部校验、方法与 content-type、CORS 配置。
  5. 关键漏洞形态:导航 CSRF、简单 content-type(form/multipart/text/plain)、JSON CSRF、登录/注销 CSRF、OAuth/OIDC、文件/动作端点、GraphQL(GET/持久化查询)、WebSocket CSRF。
  6. 绕过技巧:SameSite 细微差异(顶层 GET 带 cookie)、Origin/Referer 混淆(null/sandbox)、方法覆写、token 弱点、content-type 切换、头部操纵。
  7. 链式放大:CSRF + IDOR(强制对他人资源动作)、CSRF + Clickjacking(绕 UI 确认)、CSRF + OAuth mix-up(绑定到非预期 client)。
  8. 验证五步:跨源触发、防线失效证据、跨上下文一致、前后状态、绕过条件;警惕 token 必需/Origin 强制/幂等端点等真实误报。

下一节,我们看 IDOR 与越权——当对象引用或功能授权未被绑定到调用方,「我能不能做本不该做的事」就从可能性变成现实。


发布者: 作者: 灏天文库 转发
评论区 (0)
U