# WebSocket

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

## WebSockets

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

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

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

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

![websockets.svg](https://2753068357-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7KQ4F0M3A1jSCGxOdZRW%2Fuploads%2Fgit-blob-20b5db6e288e993f298bca1a1345a923008219bf%2Fwebsockets.svg?alt=media)

{% 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](https://wr3dmast3r.gitbook.io/portswiggerfundamental/client-side/chto-takoe-websockets#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)](https://wr3dmast3r.gitbook.io/portswiggerfundamental/client-side/websocket/kross-saitovoe-perekhvatyvanie-websocket-cswsh)
  {% endhint %}

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

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

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