PortSwigger靶场之CSRF vulnerability with no defenses通关秘籍
解决该 “无防御的 CSRF 漏洞” 靶场,从以下理论知识和实践步骤两部分详细说明:
一、核心理论知识:什么是 CSRF?
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种利用用户已认证的身份,在用户不知情的情况下,诱导其向目标网站发送 “非预期请求” 的攻击。
1. CSRF 的攻击条件
要成功发起 CSRF 攻击,需同时满足 3 个条件:
- 目标请求无防御机制:服务器未对请求进行 “CSRF 令牌验证”“Referer 验证”“SameSite Cookie 限制” 等防护(本题靶场即 “无防御” 场景)。
- 请求可预测:攻击所需的请求参数(如 URL、请求方法、表单字段)是固定或可猜测的(本题 “更改邮箱” 请求仅需
email
参数,完全可预测)。 - 用户处于 “已登录状态”:受害者需已登录目标网站(浏览器保存了认证 Cookie),此时攻击请求会自动携带 Cookie,服务器会误认为是用户 “主动操作”。
2. 靶场场景的 CSRF 原理
本题中 “更改邮箱” 功能存在 CSRF 漏洞,核心逻辑如下:
- 受害者已登录靶场账户(浏览器保存认证 Cookie);
- 攻击者诱导受害者访问 “包含恶意表单的 HTML 页面”;
- 恶意表单自动提交 “更改邮箱” 的 POST 请求,且请求会携带受害者的认证 Cookie;
- 服务器未验证请求合法性,误以为是受害者主动操作,最终修改其邮箱。
二、实践步骤:从漏洞验证到攻击完成
步骤 1:登录靶场账户,获取 “更改邮箱” 的请求信息
- 访问靶场页面,使用给定凭证
wiener:peter
登录账户; - 进入 “我的账户”(My Account)页面,找到 “更改邮箱”(Change Email)功能;
- 打开 Burp Suite,将浏览器代理设置为 Burp 的代理(默认
127.0.0.1:8080
),确保 Burp 能捕获请求; - 在 “更改邮箱” 表单中输入任意测试邮箱(如
test123@example.com
),点击 “提交”,此时 Burp 会捕获到 “更改邮箱” 的 POST 请求。
步骤 2:分析请求结构,构造 CSRF 恶意 HTML
从 Burp 捕获的请求中,提取两个关键信息:
- 请求 URL:即 “更改邮箱” 接口的地址,格式为
https://[靶场ID].web-security-academy.net/my-account/change-email
(靶场 ID 需替换为你实际的实验室 ID); - 请求参数:表单提交的
email
字段(值为你要修改的目标邮箱,注意不能与已占用邮箱重复,最终攻击需用新邮箱。
- 在 Burp 的 “代理历史” 中找到捕获的 “更改邮箱” 请求,右键点击;
- 选择 Engagement Tools → Generate CSRF PoC(生成 CSRF 攻击代码);
在弹出的窗口中,勾选 Include auto-submit script(包含自动提交脚本),点击 “Regenerate”(重新生成);
- 下方文本框会生成完整的 HTML 代码,复制该代码(这就是恶意 HTML)。
解释如下:
<!-- CSRF恶意HTML:自动提交“更改邮箱”请求 -->
<form method="POST" action="https://[你的靶场ID].web-security-academy.net/my-account/change-email"><!-- 隐藏字段:指定要修改的目标邮箱(需替换为未占用的邮箱) --><input type="hidden" name="email" value="attacker-new-email@web-security-academy.net">
</form>
<!-- 自动提交脚本:页面加载后立即提交表单,无需用户操作 -->
<script>document.forms[0].submit(); // 提交第一个表单(即上方的恶意表单)
</script>
步骤 3:将恶意 HTML 上传到漏洞服务器
在靶场提供的“漏洞服务器”(Vulnerability Server),存放恶意 HTML(受害者访问该服务器的页面即可触发攻击):
- 访问靶场的 “漏洞服务器” 页面(通常在实验室页面有入口);
- 在服务器的 “Body”(正文)输入框中,粘贴步骤 2 生成的恶意 HTML 代码;
- 点击 “Store”(存储)按钮,此时恶意 HTML 已被保存到漏洞服务器,服务器会生成一个访问链接(https://exploit-0ae70051035b725780c102be0162009e.exploit-server.net/exploit)。
步骤 4:验证恶意 HTML 有效性(自测)
在正式攻击受害者前,需先验证恶意 HTML 是否能正常工作(避免因参数错误导致攻击失败):
- 确保你仍处于
wiener:peter
账户的登录状态; - 点击漏洞服务器生成的 “View Exploit”(查看漏洞利用页面)链接,访问恶意 HTML 页面;
- 页面会自动跳转回靶场的 “我的账户” 页面,刷新后查看 “邮箱” 字段 —— 若已变为你在恶意 HTML 中设置的邮箱,说明 CSRF 攻击有效;
- 若测试后邮箱被修改,需重新登录
wiener:peter
账户,将邮箱改回原始值(避免后续测试冲突)。
步骤 5:修改邮箱,发起最终攻击
- 回到漏洞服务器页面,编辑 “Body” 中的恶意 HTML:将
email
字段的值改为一个未被占用的新邮箱(如victim-email-123@web-security-academy.net
,需确保该邮箱未被其他用户使用); - 点击 “Store” 保存修改后的恶意 HTML;
- 点击漏洞服务器页面中的 “Deliver to Victim”(交付给受害者)按钮 —— 靶场会模拟受害者访问恶意 HTML 页面;
- 若攻击成功,靶场会提示 “实验室已解决”(此时受害者的邮箱已被修改为你指定的新邮箱)。
三、关键注意事项
- 邮箱唯一性:靶场限制 “不能注册已被占用的邮箱”,因此在构造恶意 HTML 时,需使用未被任何用户(包括你自己)使用过的邮箱,否则攻击会因 “邮箱已存在” 而失败;
- 自动提交脚本:恶意 HTML 必须包含
<script>document.forms[0].submit();</script>
,否则需要用户手动点击表单按钮才能触发攻击,无法实现 “不知情触发”; - 认证状态依赖:CSRF 攻击的前提是 “受害者已登录靶场”,靶场的 “Deliver to Victim” 功能会自动模拟受害者的已登录状态,无需额外操作;
- 请求方法匹配:“更改邮箱” 请求是 POST 方法,因此恶意表单的
method
必须为POST
(若请求是 GET 方法,则表单需改为method="GET"
,参数通过 URL 传递)。
通过以上理论理解和实践步骤,即可成功利用无防御的 CSRF 漏洞,完成靶场任务。