欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

一些可能导致跨域信息泄漏的DOM API

来源:本站整理 作者:佚名 时间:2019-06-06 TAG: 我要投稿

对帧的数量的正确统计 (Frame Count)
Window DOM API 记录了如何在其他浏览环境中遍历跨域窗口的方法,方法之一就是利用文档(window.length)中的帧的数量。
let win /*Any Window reference, either iframes, opener, or open()*/;
win.frames.length;
在某些情况下,不同的状态具有相同数量的帧,这妨碍了我们对它们进行正确的分类。
在这些情况下,你可以尝试连续记录帧的数量,因为帧的数量可以直接影响你可以使用的浏览模式,或者对某些关键点的计时,或者在应用程序加载期间检测到的数量异常的帧。
const tab = window.opener; // Any Window reference
const pattern = [];
tab.location = 'https://target';
const recorder = setInterval(() => pattern.push(tab.frames.length), 0);
setTimeout(() => {
   clearInterval(recorder);
   console.log(pattern);
}, 6 * 1000);
History Length
使用history.length判断是否有上一页面,如果没有就返回到指定页面,一般是返回到首页,length属性声明了浏览器历史列表中的元素数量。
History DOM API记录历史对象可以知道用户历史记录中有多少条目。例如,通过history.pushState或正常导航,就可以获取这些信息,获取这些信息后,攻击者可用于检测跨域页面何时具有哪些类型的导航。history.pushState()主要是在不刷新浏览器的情况下,创建新的浏览记录并插入浏览记录队列中。
请注意,为了检测含有iframe标签的页面上的导航,可以只计算onload事件被触发的次数(请参阅Frame timing),在页面不能位于帧内的情况下,这种机制可能很有用。
history.length; // leaks if there was a javascript/meta-refresh redirect
错误事件
对于大多数加载子资源的HTML元素,都有在响应错误(例如错误500、404等)和解析错误的情况下触发的错误事件。
人们可以通过两种方式滥用这一点:
1. 通过检查用户是否有权访问特定的资源(参考具体示例);
2. 通过检查用户是否在过去加载了特定的资源(除非资源被缓存,否则强制执行HTTP错误);
缓存和错误事件
在获取子资源(除非缓存)时“强制”出错的一种方法是:根据不属于缓存键的数据强制服务器拒绝请求。有2种方法可以做到这一点,例如:
1.如果服务器具有Web应用程序防火墙,则可以触发误报。例如,可以尝试通过在短时间内执行许多网络请求来强制服务器触发DoS保护。
2.如果服务器对HTTP请求的大小有限制,则可以设置一个非常长的HTTP Referrer,以便在请求URL时,服务器拒绝它。
由于浏览器只会在缓存中没有内容时发出HTTP请求,因此可以注意到:
1.如果image / script / css加载没有错误,那么这必然意味着它来自缓存;
2.否则,它来自来自网络(注意,也可以使用计时方式来计算出来);
由于缓存探测攻击一直是一种被广泛应用的攻击方式,所以一些浏览器一直在考虑为每个源提供单独的缓存存储,除此之外,还没有其他更好的解决方案可用。
为了本文演示,我会在以下列一些使用超长HTTP referrer的示例代码。
(async ()=>{
  let url = 'https://otherwebsite.com/logo.jpg';
  // Evict this from the cache (force an error).
  history.replaceState(1,1,Array(16e3));
  await fetch(url, {cache: 'reload', mode: 'no-cors'});
  // Load the other page (you can also use )
  // Note that index.html must have
  history.replaceState(1,1,'/');
  f.src = 'http://otherwebsite.com/index.html';
  await new Promise(r=>{f.onload=r;});
  // Check if the image was loaded.
  // For better accuracy, use a service worker with {cache: 'force-cache'}
  history.replaceState(1,1,Array(16e3));
  let img = new Image();
  img.src = url;
  try {
    await new Promise((r, e)=>{img.onerror=e;img.onload=r;});
    alert('Resource was cached'); // Otherwise it would have errored out
  } catch(e) {
    alert('Resource was not cached'); // Otherwise it would have loaded
  }
})();
CSP违规事件
发生CSP违规时创建的CSP的违反DOM事件的对象包括被阻塞的主机信息,如果此信息泄露,则攻击者可使用这些信息了解跨域页面重定向到哪个域。
document.addEventListener('securitypolicyviolation', e => {
  // goes through here if a 3xx redirect to another domain happened
  console.log(e.blockedURI);
});
fetch('https://example.com/redirect', {mode: 'no-cors',credentials: 'include'});
媒体大小
图像、视频、音频和一些其他资源允许测量它们的持续时间(对于视频和音频)和大小(对于图像)。
计时
对于计时问题,我们必须考虑两个因素:
1.在另一个窗口/域(例如,网络,javascript等)中观察的结果;
2.衡量计时的机制;
为了抵御这些攻击,浏览器试图限制在窗口/域之间泄漏的信息量,并且在某些情况下,还试图限制用于测量时间的不同机制的准确性。
测量时间
测量时间最常用的方法是:
1.performance.now():performance.now()是相对于页面加载和数量级更精确。用例包括基准测试和其他需要高分辨率时间的情况,例如媒体(游戏,音频,视频等)应该指出的是performance.now(),它只适用于较新的浏览器(包括IE10 +)。
2.SharedArrayBuffer ;
请求时间
在严格模式下(对于GET请求)或松散模式下(对于POST请求),可以使用相同站点的cookie缓解这种计时方式代理的信息泄露。在松散模式(lax mode )下使用同站点cookie并不安全,因为它可以通过计时导航请求绕过。
let before = performance.now()
await fetch("//mail.com/search?q=foo")

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载