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 攻击。

相关推荐
HHHHHY4 小时前
使用阿里lowcode,手搓一个Carousel 走马灯容器组件
前端·react.js
用户352120195604 小时前
React-router v7
前端
Mintopia5 小时前
⚡ AI 时代,全栈 Next.js 开发的激情在哪里?
前端·aigc·全栈
Hello123网站5 小时前
300多个Html5小游戏列表和下载地址
前端·html·html5
Stringzhua5 小时前
ElementUi【饿了么ui】
前端·ui·elementui
HHHHHY5 小时前
http接口响应头类型不对,导致svg图片无法预览,前端解决方案
前端·javascript
Komorebi゛5 小时前
【React】配置别名路径
前端·react.js·前端框架
风语者日志5 小时前
CTFSHOW WEB 3
前端
普通码农5 小时前
uni.setClipboardData在 iOS 剪贴板复制失败解决方案
前端