# WebSocket

В этом разделе мы узнаем, как манипулировать сообщениями и соединениями WebSocket, опишем виды уязвимостей безопасности, которые могут возникать с WebSockets, и приведём примеры эксплуатации уязвимостей WebSockets.

## WebSockets

WebSockets широко используются в современных веб-приложениях. Они инициируются поверх HTTP (протокол передачи гипертекста) и обеспечивают долгоживущие соединения с асинхронной двусторонней связью.

WebSockets используются для самых разных целей, включая выполнение действий пользователя и передачу конфиденциальной информации. Практически любая уязвимость веб-безопасности, возникающая при обычном HTTP, может возникать и в контексте коммуникаций WebSockets.

{% hint style="info" %}
**Подробнее**

* [Что такое WebSockets](/portswiggerfundamental/client-side/websocket/chto-takoe-websockets.md)
  {% endhint %}

![websockets.svg](/files/1fsLa1OgG4mf68Sjymqr)

{% hint style="success" %}
**Labs**

Если вы уже знакомы с базовыми концепциями уязвимостей WebSockets и просто хотите попрактиковаться в их эксплуатации на реалистичных, намеренно уязвимых целях, вы можете перейти ко всем лабораторным работам по ссылке ниже.

* [View all WebSockets labs](https://portswigger.net/web-security/all-labs#websockets)
  {% endhint %}

## Манипулирование трафиком WebSocket

Поиск уязвимостей безопасности WebSockets, как правило, включает манипулирование ими способами, которых приложение не ожидает. Для этого можно использовать Burp Suite.

С помощью Burp Suite вы можете:

* [Перехватывать и изменять сообщения WebSocket](#perekhvat-i-izmenenie-soobshenii-websocket)
* [Воспроизводить и генерировать новые сообщения WebSocket](#povtornaya-otpravka-i-generaciya-novykh-soobshenii-websocket).
* [Управлять соединениями WebSocket](#manipulirovanie-websocket-soedineniyami).

### Перехват и изменение сообщений WebSocket

Вы можете использовать Burp Proxy для перехвата и изменения сообщений WebSocket следующим образом:

* Откройте встроенный браузер Burp.
* Перейдите к функции приложения, которая использует WebSockets. Определить использование WebSockets можно, работая с приложением и отслеживая записи во вкладке WebSockets history в Burp Proxy.
* Во вкладке Intercept Burp Proxy убедитесь, что перехват включён.
* Когда сообщение WebSocket отправляется из браузера или с сервера, оно будет отображено во вкладке Intercept для просмотра или изменения. Нажмите Forward, чтобы пропустить сообщение дальше.

{% hint style="info" %}
**Note**

Вы можете настроить, перехватываются ли сообщения «клиент → сервер» или «сервер → клиент» в Burp Proxy. Это делается в диалоге Settings, в настройках [WebSocket interception rules](https://portswigger.net/burp/documentation/desktop/settings/tools/proxy#websocket-interception-rules).
{% endhint %}

### Повторная отправка и генерация новых сообщений WebSocket

Помимо перехвата и on-the-fly изменения сообщений WebSocket, вы можете повторно отправлять отдельные сообщения и генерировать новые. Это делается с помощью Burp Repeater:

* В Burp Proxy выберите сообщение в WebSockets history или во вкладке Intercept и выберите в контекстном меню «Send to Repeater».
* В Burp Repeater вы можете отредактировать выбранное сообщение и отправлять его многократно.
* Вы можете ввести новое сообщение и отправить его в любом направлении — клиенту или серверу.
* В панели «History» внутри Burp Repeater можно просматривать историю сообщений, переданных по WebSocket-соединению. Сюда входят сообщения, сгенерированные вами в Burp Repeater, а также любые, которые были сгенерированы браузером или сервером через то же соединение.
* Если вы хотите отредактировать и повторно отправить любое сообщение из панели истории, выберите его и используйте «Edit and resend» в контекстном меню.

### Манипулирование WebSocket-соединениями

Помимо манипулирования сообщениями WebSocket, иногда необходимо манипулировать [рукопожатием WebSocker](/portswiggerfundamental/client-side/websocket/chto-takoe-websockets.md#kak-ustanavlivayutsya-soedineniya-websocket), устанавливающим соединение.

Есть разные ситуации, когда манипулировать рукопожатием WebSocket необходимо:

* Это позволяет добраться до большей поверхности атаки.
* Некоторые атаки могут приводить к разрыву соединения, и его нужно устанавливать заново.
* Токены или другие данные в исходном запросе рукопожатия могут устареть и нуждаться в обновлении.

Вы можете манипулировать рукопожатием WebSocket с помощью Burp Repeater:

* Отправьте сообщение WebSocket в Burp Repeater, как [уже было описано](#povtornaya-otpravka-i-generaciya-novykh-soobshenii-websocket).
* В Burp Repeater нажмите на значок карандаша рядом с URL WebSocket. Откроется мастер, позволяющий присоединиться к уже установленному WebSocket, клонировать подключённый WebSocket или переподключиться к разорванному WebSocket.
* Если вы выберете клонирование подключённого WebSocket или переподключение к разорванному WebSocket, мастер покажет полные детали запроса рукопожатия WebSocket, который можно отредактировать перед выполнением рукопожатия.
* Нажмите «Connect», и Burp попытается выполнить настроенное рукопожатие и отобразит результат. Если новое соединение WebSocket успешно установлено, вы сможете использовать его для отправки новых сообщений в Burp Repeater.

## Уязвимости безопасности WebSockets

В принципе, практически любая уязвимость веб-безопасности может возникать в контексте WebSockets:

* Пользовательский ввод, передаваемый на сервер, может обрабатываться небезопасно, что ведёт к уязвимостям, таким как SQL-инъекция (SQL injection) или XXE (внедрение внешних сущностей XML).
* Некоторые «слепые» уязвимости, достижимые через WebSockets, могут обнаруживаться только с помощью [out-of-band (OAST) техник](https://portswigger.net/blog/oast-out-of-band-application-security-testing).
* Если данные, контролируемые атакующим, передаются по WebSockets другим пользователям приложения, это может привести к XSS (Cross-Site Scripting) или другим уязвимостям на стороне клиента.

### Манипулирование сообщениями WebSocket для эксплуатации уязвимостей

Большинство уязвимостей, основанных на вводе и влияющих на WebSockets, можно находить и эксплуатировать, [изменив содержимое сообщений WebSocket](#perekhvat-i-izmenenie-soobshenii-websocket).

Например, предположим, что чат-приложение использует WebSockets для отправки чат-сообщений между браузером и сервером. Когда пользователь вводит сообщение, на сервер отправляется сообщение WebSocket примерно такого вида:

```json
{"message":"Hello Carlos"}
```

Содержимое сообщения (снова по WebSockets) передаётся другому пользователю чата и отображается в его браузере следующим образом:

```html
<td>Hello Carlos</td>
```

В этой ситуации, если не применяется другая обработка ввода или защита, атакующий может выполнить XSS-атаку, отправив следующее сообщение WebSocket:

```json
{"message":"<img src=1 onerror='alert(1)'>"}
```

{% hint style="success" %}
**LAB**

[**Manipulating WebSocket messages to exploit vulnerabilities**](https://portswigger.net/web-security/websockets/lab-manipulating-messages-to-exploit-vulnerabilities)
{% endhint %}

### Манипулирование рукопожатием WebSocket для эксплуатации уязвимостей

Некоторые уязвимости WebSockets можно найти и эксплуатировать только [манипулируя соединением WebSocket](#manipulirovanie-trafikom-websocket). Эти уязвимости обычно связаны с изъянами в проектировании, такими как:

* Неправомерное доверие HTTP-заголовкам при принятии решений по безопасности, например заголовку `X-Forwarded-For`.
* Недочёты в механизмах управления сессиями, поскольку контекст сессии, в котором обрабатываются сообщения WebSocket, обычно определяется контекстом сессии сообщения рукопожатия.
* Поверхность атаки, добавляемая нестандартными HTTP-заголовками, используемыми приложением.

{% hint style="success" %}
**LAB**

[**Manipulating the WebSocket handshake to exploit vulnerabilities**](https://portswigger.net/web-security/websockets/lab-manipulating-handshake-to-exploit-vulnerabilities)
{% endhint %}

### Использование кросс-сайтовых WebSockets для эксплуатации уязвимостей

Некоторые уязвимости WebSockets возникают, когда атакующий устанавливает кросс-доменное соединение WebSocket с сайта, которым он управляет. Это называется кросс-сайтовым перехватыванием WebSocket (CSWSH) и по сути является эксплуатацией уязвимости CSRF (Cross-Site Request Forgery) в рукопожатии WebSocket. Такая атака часто имеет серьёзные последствия, позволяя атакующему выполнять привилегированные действия от имени жертвы или перехватывать конфиденциальные данные, к которым у жертвы есть доступ.

{% hint style="info" %}
**Подробнее**

* [Cross-site WebSocket hijacking (CSWSH)](/portswiggerfundamental/client-side/websocket/kross-saitovoe-perekhvatyvanie-websocket-cswsh.md)
  {% endhint %}

## Как защитить соединение WebSocket

Чтобы минимизировать риск возникновения уязвимостей безопасности при работе с WebSockets, следуйте этим рекомендациям:

* Используйте протокол `wss://` (WebSockets поверх TLS (протокол транспортного уровня безопасности)).
* Жёстко задавайте URL конечной точки WebSocket и ни в коем случае не включайте в этот URL данные, контролируемые пользователем.
* Защитите сообщение рукопожатия WebSocket от CSRF, чтобы избежать уязвимостей Cross-site WebSocket hijacking.
* Рассматривайте данные, полученные по WebSocket, как недоверенные в обоих направлениях. Безопасно обрабатывайте данные и на сервере, и на клиенте, чтобы предотвратить уязвимости, основанные на вводе, такие как SQL-инъекция и XSS.


---

# Agent Instructions: Querying This Documentation

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

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wr3dmast3r.gitbook.io/portswiggerfundamental/client-side/websocket.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
