# 【juice-shop】★★★ CSRF：跨站请求伪造修改用户名


# 【juice-shop】★★★ CSRF：跨站请求伪造修改用户名

## 0x01 任务简报

<blockquote style="border-left: 5px solid #6f42c1; background-color: #f5f3ff; padding: 20px; margin: 1.5rem 0; color: #5521b5; line-height: 1.8; border-radius: 0 5px 5px 0;">
<div style="font-weight: bold; font-size: 1.1rem; margin-bottom: 10px; display: flex; align-items: center;">
<span style="margin-right: 8px;">💡</span> 提示 (Hints)
</div>
1. 查找更新用户名的表单，在 HTML 在线编辑器中构建恶意页面。可能需要旧版浏览器。<br>
2. 看看在个人资料页面更改用户名时会发生什么。<br>
3. 搜索有关 CSRF 攻击的信息，寻找可应用于本挑战的示例。<br>
4. 在 http://htmledit.squarefree.com 中编写 CSRF 攻击代码，验证是否更改了用户名。
</blockquote>

> **注意：** 本题需要旧版浏览器（新版浏览器会因 SameSite Cookie 保护而拒绝跨站脚本自动携带 Cookie）。

这题需要旧版浏览器（新版浏览器会拒绝跨站脚本自带的Cookie），我这里暂时没有旧版浏览器，直接发思路吧……

---

## 0x02 实战：复现漏洞

### 🔍 第一步：分析用户名修改请求

打开 Burp Suite，登录账户后，在个人资料页面修改用户名一次，捕获并分析请求包。

观察 POST 请求的结构，记录以下信息：

- **请求 URL**：`http://localhost:3000/profile`
- **请求方法**：POST
- **参数**：`username=<新用户名>`

### 💉 第二步：构造 CSRF 恶意页面

创建一个 HTML 文件，包含自动提交的表单：

```html
<form action="http://localhost:3000/profile" method="POST">
  <input name="username" value="CSRF"/>
  <input type="submit"/>
</form>
<script>document.forms[0].submit();</script>
```

**工作原理：**

1. 表单指向目标服务器的用户名修改接口
2. 隐藏的 `<input>` 字段包含恶意的新用户名
3. JavaScript 自动提交表单，无需用户交互
4. 浏览器自动携带已登录用户的 Cookie，请求被服务器认为合法

### 🌐 第三步：在线编辑并测试

**方案 A：使用在线 HTML 编辑器**

访问 http://htmledit.squarefree.com ，将上述 HTML 代码粘贴并运行。

**方案 B：本地文件测试**

1. 创建 `csrf.html` 文件，保存上述代码
2. 使用旧版浏览器打开该文件
3. 页面自动提交表单，修改已登录用户的用户名

### ⚠️ 第四步：浏览器版本要求

**为什么需要旧版浏览器？**

现代浏览器（Chrome 80+、Firefox 60+）默认设置 `SameSite=Lax` Cookie 属性，跨站请求不会自动携带 Cookie，导致 CSRF 攻击失效。

**解决方案：**

- 使用 Firefox 52 ESR 或 Chrome 79 及以下版本
- 或在现代浏览器中禁用 SameSite 保护：
  - Chrome：`chrome://flags/#same-site-by-default-cookies` → Disabled
  - Firefox：`about:config` → `network.cookie.sameSite.laxByDefault = false`

### ✅ 第五步：完成挑战

成功修改用户名后，挑战完成。

