WebSocket
В этом разделе мы узнаем, как манипулировать сообщениями и соединениями WebSocket, опишем виды уязвимостей безопасности, которые могут возникать с WebSockets, и приведём примеры эксплуатации уязвимостей WebSockets.
WebSockets
WebSockets широко используются в современных веб-приложениях. Они инициируются поверх HTTP (протокол передачи гипертекста) и обеспечивают долгоживущие соединения с асинхронной двусторонней связью.
WebSockets используются для самых разных целей, включая выполнение действий пользователя и передачу конфиденциальной информации. Практически любая уязвимость веб-безопасности, возникающая при обычном HTTP, может возникать и в контексте коммуникаций WebSockets.
Labs
Если вы уже знакомы с базовыми концепциями уязвимостей WebSockets и просто хотите попрактиковаться в их эксплуатации на реалистичных, намеренно уязвимых целях, вы можете перейти ко всем лабораторным работам по ссылке ниже.
Манипулирование трафиком WebSocket
Поиск уязвимостей безопасности WebSockets, как правило, включает манипулирование ими способами, которых приложение не ожидает. Для этого можно использовать Burp Suite.
С помощью Burp Suite вы можете:
Перехват и изменение сообщений WebSocket
Вы можете использовать Burp Proxy для перехвата и изменения сообщений WebSocket следующим образом:
Откройте встроенный браузер Burp.
Перейдите к функции приложения, которая использует WebSockets. Определить использование WebSockets можно, работая с приложением и отслеживая записи во вкладке WebSockets history в Burp Proxy.
Во вкладке Intercept Burp Proxy убедитесь, что перехват включён.
Когда сообщение WebSocket отправляется из браузера или с сервера, оно будет отображено во вкладке Intercept для просмотра или изменения. Нажмите Forward, чтобы пропустить сообщение дальше.
Повторная отправка и генерация новых сообщений 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