PortSwigger靶场之 CSRF where token is not tied to user session通关秘籍
要解决 “令牌与用户会话不绑定的 CSRF” 靶场,核心在于核心核心是利用服务器的验证缺陷 ——CSRF 令牌未与用户会话绑定,导致攻击者可以复用其他用户的令牌发起攻击。以下从理论原理和实践步骤两部分详细说明:
一、核心理论知识:令牌与会话未绑定的 CSRF 漏洞
正常的 CSRF 令牌防御机制要求:令牌必须与用户会话(Session)严格绑定,即每个用户的令牌仅对自己的会话有效,其他用户使用该令牌会被拒绝。
而本靶场的漏洞在于:令牌是 “全局共享” 或 “仅与用户账号弱关联”,不与具体会话绑定。这意味着:
- 攻击者可以用自己账号的 CSRF 令牌,构造恶意请求攻击其他用户;
- 即使受害者与攻击者是不同用户,服务器也会认可攻击者提供的令牌(因为不验证令牌所属的会话)。
二、实践步骤:从漏洞验证到攻击完成
步骤 1:准备两个账号,获取各自的 CSRF 令牌
靶场提供了两个账号,需分别获取它们的 CSRF 令牌用于测试:
-
登录第一个账号(wiener:peter)
- 进入 “我的账户” 页面,打开 Burp 拦截功能;
- 提交 “更改邮箱” 表单(随便填一个测试邮箱),拦截 POST 请求;
- 记录请求中的
csrf
令牌值(如csrf=qDrz6lMDQpzgVaLafGLsIlghGg1jQx96
),然后放弃该请求(不发送到服务器,避免实际修改邮箱)。
-
登录第二个账号(carlos:montoya)
- 打开浏览器隐私模式(避免会话冲突),登录该账号;
- 同样提交 “更改邮箱” 表单,拦截请求并记录其
csrf
令牌(如csrf=XNIBRbSGKbYDEdGe5J9NBgsw2qJFO0fB
)。
步骤 2:验证 “令牌可跨会话复用”
通过 Burp Repeater 测试令牌是否与会话绑定:
- 在隐私模式下(carlos 账号的会话),将拦截的 “更改邮箱” 请求发送到 Repeater;
- 修改请求中的
csrf
令牌值,将其替换为 wiener 账号的令牌 - 确保请求体中的
email
是新邮箱(如test-cross@example.com
),发送请求; - 观察响应:
- 若服务器返回 302 重定向(跳转到账户主页),且查看 carlos 账号的邮箱已被修改,说明 令牌可跨会话复用(漏洞确认)。
- 若服务器返回 302 重定向(跳转到账户主页),且查看 carlos 账号的邮箱已被修改,说明 令牌可跨会话复用(漏洞确认)。
步骤 3:构造包含 “攻击者令牌” 的恶意 HTML
由于令牌不与会话绑定,直接使用自己账号(如 wiener)的 CSRF 令牌构造恶意表单即可:
- 注意:令牌是 “一次性的”(使用后失效),测试时发现令牌无效,重新获取 wiener 账号的新令牌替换(csrf=tZ7RL9JwrbA0GKa3IfiXtGvf4XRoEjcw)
步骤 4:上传恶意 HTML 到漏洞服务器并验证
- 访问靶场的 “漏洞服务器”,将上述 HTML 粘贴到 “Body” 中,点击 “Store”;
- 用隐私模式打开 carlos 账号(模拟受害者),访问漏洞服务器的 “View Exploit” 页面;
- 查看 carlos 账号的邮箱确实被修改,说明恶意 HTML 有效(攻击者的令牌被受害者的会话接受)。
步骤 5:发起最终攻击
- 确保恶意 HTML 中的
email
是未被占用的新邮箱(避免与测试邮箱冲突); - 若令牌是一次性的,重新获取 wiener 账号的最新令牌替换到 HTML 中,再次 “Store”;
- 点击 “Deliver to Victim”,靶场会模拟受害者访问恶意页面,其邮箱将被成功修改,实验室提示 “已解决”。
三、关键注意事项
- 令牌的时效性:若令牌是一次性的(使用后立即失效),需在发起攻击前重新获取最新令牌;
- 跨账号验证:必须通过两个账号的交叉测试,确认令牌可复用(如用 wiener 的令牌修改 carlos 的邮箱);
- 邮箱唯一性:最终攻击使用的邮箱需未被任何用户占用
通过以上步骤,利用 “令牌与会话不绑定” 的漏洞,复用攻击者的 CSRF 令牌即可绕开防御,成功完成 CSRF 攻击。