Vander
Команда форума
- 10.11.2019
- 495
- 1 158
Приветствую уважаемую аудиторию форума Protey!
В этом разделе мы объясним, как управлять сообщениями и соединениями WebSocket, опишем виды уязвимостей, которые могут возникнуть в результате работы WebSockets, а также приведем несколько примеров использования WebSocket уязвимостей.
Что такое WebSocket?
WebSocket — протокол связи поверх TCP-соединения, предназначенный для обмена сообщениями между браузером и веб-сервером в режиме реального времени.
В настоящее время в W3C осуществляется стандартизация API Web Sockets. Черновой вариант стандарта этого протокола утверждён IETF.
WebSocket разработан для воплощения в веб-браузерах и веб-серверах, но он может быть использован для любого клиентского или серверного приложения. Протокол WebSocket — это независимый протокол, основанный на протоколе TCP. Он делает возможным более тесное взаимодействие между браузером и веб-сайтом, способствуя распространению интерактивного содержимого и созданию приложений реального времени.
WebSockets широко используются в современных веб-приложениях. Они инициируются через HTTP и обеспечивают долговременные соединения с асинхронной связью в обоих направлениях.
WebSockets используются для самых разных целей, включая выполнение действий пользователя и передачу конфиденциальной информации. Практически любая уязвимость веб-безопасности, возникающая при обычном HTTP, также может возникать в связи с коммуникациями WebSockets.
WebSockets - это двунаправленный протокол полнодуплексной связи, инициированный через HTTP. Они широко используются в современных веб-приложениях для потоковой передачи данных и другого асинхронного трафика.
Далее мы объясним разницу между HTTP и WebSocket, опишем, как устанавливаются соединения WebSocket, и обрисуем, как выглядят сообщения WebSocket.
В чем разница между HTTP и WebSockets?
Большая часть связи между веб-браузерами и веб-сайтами использует HTTP. С помощью HTTP клиент отправляет запрос, а сервер возвращает ответ. Как правило, ответ происходит немедленно, и транзакция завершена. Даже если сетевое соединение остается открытым, оно будет использоваться для отдельной транзакции запроса и ответа.
Некоторые современные веб-сайты используют WebSockets. Соединения WebSocket инициируются через HTTP и обычно долговечны. Сообщения могут быть отправлены в любом направлении в любое время и не имеют транзакционного характера. Соединение обычно остается открытым и бездействующим, пока клиент или сервер не будут готовы отправить сообщение.
WebSockets особенно полезны в ситуациях, когда требуются сообщения с низкой задержкой или инициируемые сервером сообщения, такие как потоки финансовых данных в реальном времени.
Как устанавливаются соединения WebSocket?
Соединения WebSocket обычно создаются с использованием клиентского JavaScript, как показано ниже:
Код:
var ws = new WebSocket("wss://normal-website.com/chat");
- Протокол wss устанавливает WebSocket через зашифрованное соединение TLS, в то время как протокол ws использует незашифрованное соединение.
Код:
GET /chat HTTP/1.1
Host: normal-website.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==
Connection: keep-alive, Upgrade
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
Upgrade: websocket
Код:
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
Заметка
Стоит отметить несколько особенностей сообщений рукопожатия WebSocket:
- Заголовки Connection и Upgrade в запросе и ответе указывают, что это рукопожатие WebSocket.
- Заголовок запроса Sec-WebSocket-Version указывает версию протокола WebSocket, которую клиент желает использовать. Обычно это 13.
- Заголовок запроса Sec-WebSocket-Key содержит случайное значение в кодировке Base64, которое должно генерироваться случайным образом в каждом запросе квитирования.
- Заголовок ответа Sec-WebSocket-Accept содержит хэш значения, представленного в заголовке запроса Sec-WebSocket-Key, объединенного с определенной строкой, определенной в спецификации протокола. Это сделано для предотвращения вводящих в заблуждение ответов в результате неверно настроенных серверов или кэширования прокси.
Как только соединение WebSocket установлено, сообщения могут отправляться клиентом или сервером асинхронно в любом направлении.
Простое сообщение может быть отправлено из браузера с использованием клиентского JavaScript, как показано ниже:
Код:
ws.send("Peter Wiener");
Например, приложение чат-бота, использующее WebSockets, может отправить сообщение, подобное следующему:
Код:
{"user":"Hal Pline","content":"I wanted to be a Playstation growing up, not a device to answer your inane questions"}