javascript - HTML5 跨文档消息传递 : can Malicious code sniff messages between domainA. com 和 domainB.com?

标签 javascript security websocket cross-domain xss

根据 10.4 Cross-document messaging : domainA.com 可以使用跨文档消息传递的方式向 domainB.com 发送消息,以在源和数据验证时防止跨站点脚本攻击。

enter image description here

问题:假设 domainA.com 遭到破坏,攻击者注入(inject)了有效负载来跟踪 domainA.com 和 domainB.com 之间的消息,这可能吗?

为了更好地理解:可以通过更改原始 Web Socket 对象来嗅探 Web Socket 流量,工作示例解释了 Here ,我提取了这部分:

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;
}
}
});

最佳答案

如果 domainA.com 遭到破坏,您就完蛋了。注入(inject)的脚本可以只添加另一个窗口“消息”事件处理程序,并且因为它在同一个源上,它开始接收域 B postMessage 的所有内容,并且能够将消息发送回域 B。

不仅如此,他们还可以使用 JS 找到 iframe,删除任何沙箱标签,允许将其视为同一来源,访问其内容,然后开始在该来源上执行任意 JS。它甚至可以修补方法,以便注入(inject)的脚本接收所有内容,而合法代码则不会。

但是,如果他们只能注入(inject)域 B,并且 iframe 已正确沙盒化,则他们无法更改域 A 所做的任何事情。不过,这仍然足以让他们看到 postMessage() 发送和接收的所有内容。

最好的办法可能是让“secureDomain.com”在沙盒 iframe 中包含两个脚本,然后它们可以相互通信。假设无法注入(inject) secureDomain.com,那么至少注入(inject)只会影响单个域,并且不允许同时访问这两个域。

关于javascript - HTML5 跨文档消息传递 : can Malicious code sniff messages between domainA. com 和 domainB.com?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16456088/

相关文章:

javascript - 当我在完整日历中创建第二个事件时,会创建两个事件

javascript - 根据javascript中的顺序号将对象推送到数组

javascript - 这是一种安全的方式吗? Redux React 身份验证

PHP 响应并行请求

ubuntu - 我可以在本地服务器上使用 signalR,但我不能在真实服务器上使用它,我收到代理错误

javascript - 将 GMT 时间转换为本地时间

javascript - 在 jquery.colorfy 之后设置 Textarea 的值

security - SilverStripe 3.1.x https - 是否有用于为共享 SSL 设置安全基本 URL 的配置选项?

c# - 使用 C# 访问 Windows 服务证书存储中的 x509 证书

node.js - Socket.io 断开事件和相关关闭的垃圾回收