> 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/websockets/websocket-message-manipulation.md).

# WebSocket 消息操纵

WebSocket 消息操纵，PortSwigger Web Security Academy 实验笔记，包括利用流程、载荷测试、Burp Suite 验证以及修复上下文。

### 操纵 WebSocket 消息以利用漏洞

这个网上商店具有实时 **聊天功能** 使用 **WebSockets**. / 用户发送的消息会立即显示在一名 **客服人员**. / 该实验的目标是要 **启动一个 `alert()`** 通过操纵一条 WebSocket 消息，在客服人员的浏览器中弹出一个弹窗。

应用中提供了一个聊天输入框。

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-8a1408cc26bd95a22c440833e76f726023c18500%2F%7B4BB30044-5EE6-47A0-B6F3-F645051D0B20%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-70edba498d5cac096e2c547c81053d56c9f57b51%2F%7B36CF1F66-78CE-403E-A5F0-FF2734D3448E%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

通过检查流量，可以看到消息通过 WebSocket 发送如下：

```json
{
    "user":"你",
    "content":"嗨"
}
```

**过滤测试**

尝试通过聊天发送以下载荷：

```javascript
<script>alert(0)</script>
```

观察到的结果：/ 该内容在\*\*服务器端被转义\*\*并被当作文本解析：

```javascript
&lt;script&gt;alert(0)&lt;/script&gt;
```

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-998def77cef804e25c4d01b95be3f538aa45ba77%2F%7B25FE3FD3-7F35-4E9A-88AF-375EB6C95410%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

这表明存在针对 `<script>` 标签的基本过滤。

**绕过过滤**

随后手动发送一条包含以下载荷的 WebSocket 消息：

```http
<img src=0 onerror=alert(0)>
```

该消息 **被直接转发** 通过 WebSocket 请求发送，而无需经过常规界面控件。

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-8e265e5c6749384a69f9ab3bc8f9c4960a399ec9%2F%7BA183AEF0-146B-4DA5-A143-C3FA4387074B%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

当客服人员收到该消息时，浏览器会解析该 `onerror` 属性，从而触发：

* 执行 `alert(0)`
* 出现一个 **弹出窗口** 在客服人员的浏览器中

<figure><img src="https://1574813340-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-5b7ccce08c52c64fb935796e485d5b78d3df2097%2F%7B772C48AA-30F3-46DE-AF8D-DBB33B9C5136%7D.png?alt=media" alt=""><figcaption></figcaption></figure>


---

# 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/websockets/websocket-message-manipulation.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.
