WebSocket

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

WebSockets

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

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

websockets.svg

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

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

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

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

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

  • Откройте встроенный браузер Burp.

  • Перейдите к функции приложения, которая использует WebSockets. Определить использование WebSockets можно, работая с приложением и отслеживая записи во вкладке WebSockets history в Burp Proxy.

  • Во вкладке Intercept Burp Proxy убедитесь, что перехват включён.

  • Когда сообщение WebSocket отправляется из браузера или с сервера, оно будет отображено во вкладке Intercept для просмотра или изменения. Нажмите Forward, чтобы пропустить сообщение дальше.

Note

Вы можете настроить, перехватываются ли сообщения «клиент → сервер» или «сервер → клиент» в Burp Proxy. Это делается в диалоге Settings, в настройках WebSocket interception rules.

Повторная отправка и генерация новых сообщений 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, устанавливающим соединение.

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

  • Это позволяет добраться до большей поверхности атаки.

  • Некоторые атаки могут приводить к разрыву соединения, и его нужно устанавливать заново.

  • Токены или другие данные в исходном запросе рукопожатия могут устареть и нуждаться в обновлении.

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

  • Отправьте сообщение WebSocket в Burp Repeater, как уже было описано.

  • В 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) техник.

  • Если данные, контролируемые атакующим, передаются по WebSockets другим пользователям приложения, это может привести к XSS (Cross-Site Scripting) или другим уязвимостям на стороне клиента.

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

Большинство уязвимостей, основанных на вводе и влияющих на WebSockets, можно находить и эксплуатировать, изменив содержимое сообщений WebSocket.

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

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

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

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

Некоторые уязвимости WebSockets можно найти и эксплуатировать только манипулируя соединением WebSocket. Эти уязвимости обычно связаны с изъянами в проектировании, такими как:

  • Неправомерное доверие HTTP-заголовкам при принятии решений по безопасности, например заголовку X-Forwarded-For.

  • Недочёты в механизмах управления сессиями, поскольку контекст сессии, в котором обрабатываются сообщения WebSocket, обычно определяется контекстом сессии сообщения рукопожатия.

  • Поверхность атаки, добавляемая нестандартными HTTP-заголовками, используемыми приложением.

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

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

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

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

  • Используйте протокол wss:// (WebSockets поверх TLS (протокол транспортного уровня безопасности)).

  • Жёстко задавайте URL конечной точки WebSocket и ни в коем случае не включайте в этот URL данные, контролируемые пользователем.

  • Защитите сообщение рукопожатия WebSocket от CSRF, чтобы избежать уязвимостей Cross-site WebSocket hijacking.

  • Рассматривайте данные, полученные по WebSocket, как недоверенные в обоих направлениях. Безопасно обрабатывайте данные и на сервере, и на клиенте, чтобы предотвратить уязвимости, основанные на вводе, такие как SQL-инъекция и XSS.

Last updated