5

根据10.4 跨文档消息传递:domainA.com 可以使用跨文档消息传递向 domainB.com 发送消息,以防止在验证来源和数据时进行跨站点脚本攻击。

在此处输入图像描述

问题:考虑 domainA.com 被攻破,攻击者注入了一个有效载荷来跟踪 domainA.com 和 domainB.com 之间的消息,这可能吗?

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

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

1 回答 1

2

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

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

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

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

于 2013-05-18T14:12:31.210 回答