PortSwigger靶场之 CSRF where token is not tied to user session通关秘籍

要解决 "令牌与用户会话不绑定的 CSRF" 靶场,核心在于核心核心是利用服务器的验证缺陷 ------CSRF 令牌未与用户会话绑定,导致攻击者可以复用其他用户的令牌发起攻击。以下从理论原理和实践步骤两部分详细说明:

一、核心理论知识:令牌与会话未绑定的 CSRF 漏洞

正常的 CSRF 令牌防御机制要求:令牌必须与用户会话(Session)严格绑定,即每个用户的令牌仅对自己的会话有效,其他用户使用该令牌会被拒绝。

而本靶场的漏洞在于:令牌是 "全局共享" 或 "仅与用户账号弱关联",不与具体会话绑定。这意味着:

  • 攻击者可以用自己账号的 CSRF 令牌,构造恶意请求攻击其他用户;
  • 即使受害者与攻击者是不同用户,服务器也会认可攻击者提供的令牌(因为不验证令牌所属的会话)。

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

步骤 1:准备两个账号,获取各自的 CSRF 令牌

靶场提供了两个账号,需分别获取它们的 CSRF 令牌用于测试:

  1. 登录第一个账号(wiener:peter)

    • 进入 "我的账户" 页面,打开 Burp 拦截功能;
    • 提交 "更改邮箱" 表单(随便填一个测试邮箱),拦截 POST 请求;
    • 记录请求中的 csrf 令牌值(如 csrf=qDrz6lMDQpzgVaLafGLsIlghGg1jQx96),然后放弃该请求(不发送到服务器,避免实际修改邮箱)。
  2. 登录第二个账号(carlos:montoya)

    • 打开浏览器隐私模式(避免会话冲突),登录该账号;
    • 同样提交 "更改邮箱" 表单,拦截请求并记录其 csrf 令牌(如 csrf=XNIBRbSGKbYDEdGe5J9NBgsw2qJFO0fB)。

步骤 2:验证 "令牌可跨会话复用"

通过 Burp Repeater 测试令牌是否与会话绑定:

  1. 在隐私模式下(carlos 账号的会话),将拦截的 "更改邮箱" 请求发送到 Repeater;
  2. 修改请求中的 csrf 令牌值,将其替换为 wiener 账号的令牌
  3. 确保请求体中的 email 是新邮箱(如 test-cross@example.com),发送请求;
  4. 观察响应:
    • 若服务器返回 302 重定向(跳转到账户主页),且查看 carlos 账号的邮箱已被修改,说明 令牌可跨会话复用 (漏洞确认)。

步骤 3:构造包含 "攻击者令牌" 的恶意 HTML

由于令牌不与会话绑定,直接使用自己账号(如 wiener)的 CSRF 令牌构造恶意表单即可:

  • 注意:令牌是 "一次性的"(使用后失效),测试时发现令牌无效,重新获取 wiener 账号的新令牌替换(csrf=tZ7RL9JwrbA0GKa3IfiXtGvf4XRoEjcw)

步骤 4:上传恶意 HTML 到漏洞服务器并验证

  1. 访问靶场的 "漏洞服务器",将上述 HTML 粘贴到 "Body" 中,点击 "Store";
  2. 用隐私模式打开 carlos 账号(模拟受害者),访问漏洞服务器的 "View Exploit" 页面;
  3. 查看 carlos 账号的邮箱确实被修改,说明恶意 HTML 有效(攻击者的令牌被受害者的会话接受)。

步骤 5:发起最终攻击

  1. 确保恶意 HTML 中的 email 是未被占用的新邮箱(避免与测试邮箱冲突);
  2. 若令牌是一次性的,重新获取 wiener 账号的最新令牌替换到 HTML 中,再次 "Store";
  3. 点击 "Deliver to Victim",靶场会模拟受害者访问恶意页面,其邮箱将被成功修改,实验室提示 "已解决"。

三、关键注意事项

  1. 令牌的时效性:若令牌是一次性的(使用后立即失效),需在发起攻击前重新获取最新令牌;
  2. 跨账号验证:必须通过两个账号的交叉测试,确认令牌可复用(如用 wiener 的令牌修改 carlos 的邮箱);
  3. 邮箱唯一性:最终攻击使用的邮箱需未被任何用户占用

通过以上步骤,利用 "令牌与会话不绑定" 的漏洞,复用攻击者的 CSRF 令牌即可绕开防御,成功完成 CSRF 攻击。

相关推荐
霍理迪1 小时前
CSS——背景样式以及雪碧图、渐变
前端·css
jump_jump5 小时前
基于 Squoosh WASM 的浏览器端图片转换库
前端·javascript·性能优化
小二·8 小时前
前端监控体系完全指南:从错误捕获到用户行为分析(Vue 3 + Sentry + Web Vitals)
前端·vue.js·sentry
阿珊和她的猫9 小时前
`require` 与 `import` 的区别剖析
前端·webpack
谎言西西里10 小时前
零基础 Coze + 前端 Vue3 边玩边开发:宠物冰球运动员生成器
前端·coze
努力的小郑10 小时前
2025年度总结:当我在 Cursor 里敲下 Tab 的那一刻,我知道时代变了
前端·后端·ai编程
GIS之路10 小时前
GDAL 实现数据空间查询
前端
OEC小胖胖10 小时前
01|从 Monorepo 到发布产物:React 仓库全景与构建链路
前端·react.js·前端框架
2501_9447114311 小时前
构建 React Todo 应用:组件通信与状态管理的最佳实践
前端·javascript·react.js
困惑阿三11 小时前
2025 前端技术全景图:从“夯”到“拉”排行榜
前端·javascript·程序人生·react.js·vue·学习方法