对帧的数量的正确核算 (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://www.hack56.com/images/3d4o541aztp.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]黑客接单网