笑話大全ico
您當前的位置 :廈門門戶網>黑客安全>腳本攻防> 正文
針對XSS漏洞的前端防火墻:可疑模塊攔截
2014-06-23 10:58來源:廈門門戶網
【摘要】
上一篇 介紹的系統,雖然能防御簡單的內聯XSS 代碼,但想繞過還是很容易的。 由于是在前端防護,策略配置都能在源代碼里找到,因此很快就能試出破解方案。并且攻擊者可以屏蔽日志接口

上一篇介紹的系統,雖然能防御簡單的內聯XSS 代碼,但想繞過還是很容易的。 軟件下載就到soft.xmyy.com

由于是在前端防護,策略配置都能在源代碼里找到,因此很快就能試出破解方案。并且攻擊者可以屏蔽日志接口,在自己電腦上永不發出報警信息,保證測試時不會被發現。 廈門博愛xmboai.com

昨天提到最簡單并且最常見的XSS代碼,就是加載站外的一個腳本文件。對于這種情況,關鍵字掃描就無能為力了,因為代碼可以混淆的千變萬化,我們看不出任何異常,只能將其放行。 MD5密碼在線加密解密破解cnmd5.com

因此,我們還需增加一套可疑模塊跟蹤系統。 網址導航就用ok118.com

被動掃描

中國破解cncrack.com

和之前說的一樣,最簡單的辦法仍是遍歷掃描。我們可以定時分析頁面里的腳本元素,發現有站外地址的腳本就發送預警日志。 軟件下載就到soft.xmyy.com

如果昨天說的內聯事件使用定時掃描,或許還能在觸發前攔截一部分,但對于腳本則完全不可能了。腳本元素一旦被掛載到主節點之下,就立即加載并執行了。除非定時器開的特別短,能在腳本加載的過程中將其銷毀,或許還能攔截,否則一不留神就錯過了。 廈門門戶網xmyy.com xmdoor.com

我們得尋找更高端的瀏覽器接口,能在元素創建或添加時,進行分析和攔截。 網址導航就用ok118.com

主動防御

中國破解cncrack.com

在無所不能的 HTML5 里,這當然是能辦到的,它就是 MutationEvent。與其相關的有兩個玩意:一個叫 DOMNodeInserted 的事件,另一個則是 MutationObserver 類。 廈門臺球xmpool.com

前者雖然是個事件,但即使阻止冒泡它,或調用 preventDefault 這些方法,仍然無法阻止元素被添加;而后者就不用說了,看名字就是一個觀察器,顯然優先級會更低。 搜什么,找蝦米搜索xmsou.com

MutationEvent 試探 廈門臺球xmpool.com

但不管能否實現我們的目標,既然有這么個東西,就先測試看看究竟能有多大的本領。

廈門門戶網xmyy.com xmdoor.com

  1. <script> 
  2.     var observer = new MutationObserver(function(mutations) {  
  3.         console.log('MutationObserver:', mutations);  
  4.     });  
  5.     observer.observe(document, {  
  6.         subtree: true,  
  7.         childList: true  
  8.     });  
  9.  
  10.     document.addEventListener('DOMNodeInserted', function(e) {  
  11.         console.log('DOMNodeInserted:', e);  
  12.     }, true);  
  13. </script> 
  14.  
  15. <script>console.warn('site-in xss 1');</script> 
  16. <script src="http://www.etherdream.com/xss/out.js"></script> 
  17. <script>console.warn('site-in xss 2');</script> 
  18.  
  19. <button id="btn">創建腳本</button> 
  20. <script> 
  21.     btn.onclick = function() {  
  22.         var el = document.createElement('script');  
  23.         el.src = 'http://www.etherdream.com/xss/out.js?dynamic';  
  24.         document.body.appendChild(el);  
  25.     };  
  26. </script> 
找工作、找人才,就上廈門人才市場網站xmrcsc.com

Run 廈門色網xmsex.com 福建色網fjsex.com

出乎意料的是,MutationObserver 居然能逐一捕捉到頁面加載時產生的靜態元素,這在過去只能通過定時器才能勉強實現。同時為了更高效的記錄,MutationObserver 并非發現新元素就立即回調,而是將一個時間片段里出現的所有元素,一起傳過來。這對性能來說是件好事,但顯然會損失一些優先級。

中國破解cncrack.com

再看DOMNodeInserted,它雖然無法捕獲到靜態元素,但在動態創建元素時,它比 MutationObserver 更早觸發,擁有更高的優先級。 網址導航就用ok118.com

靜態腳本攔截 網址導航就用ok118.com

接著再來嘗試,能否利用這兩個事件,銷毀可疑的腳本元素,以達到主動攔截的效果。 廈門門戶網xmyy.com xmdoor.com

  1. <script> 
  2.     var observer = new MutationObserver(function(mutations) {  
  3.         mutations.forEach(function(mutation) {  
  4.  
  5.             var nodes = mutation.addedNodes;  
  6.             for (var i = 0; i < nodes.length; i++) {  
  7.                 var node = nodes[i];  
  8.  
  9.                 if (/xss/.test(node.src) || /xss/.test(node.innerHTML)) {  
  10.                     node.parentNode.removeChild(node);  
  11.                     console.log('攔截可疑模塊:', node);  
  12.                 }  
  13.             }  
  14.         });  
  15.     });  
  16.  
  17.     observer.observe(document, {  
  18.         subtree: true,  
  19.         childList: true  
  20.     });  
  21. </script> 
  22.  
  23. <script>console.warn('site-in xss 1');</script> 
  24. <script src="http://www.etherdream.com/xss/out.js"></script> 
  25. <script>console.warn('site-in xss 2');</script> 
  26.  
  27. <button id="btn">創建腳本</button> 
  28. <script> 
  29.     btn.onclick = function() {  
  30.         var el = document.createElement('script');  
  31.         el.src = 'http://www.etherdream.com/x\ss/out.js?dynamic';  
  32.         document.body.appendChild(el);  
  33.     };  
  34. </script> 
軟件下載就到soft.xmyy.com

Run 廈門紙業xmpaper.com

又是一個出人意料的結果,所有靜態腳本被成功攔截了! 新名堂xmtang.com

針對XSS漏洞的前端防火墻:可疑模塊攔截 

廈門門戶網xmyy.com xmdoor.com

針對XSS漏洞的前端防火墻:可疑模塊攔截 中國破解cncrack.com

廈門紙業xmpaper.com

然而這并非標準。FireFox 雖然攔截到腳本,但仍然執行代碼了。 找工作、找人才,就上廈門人才市場網站xmrcsc.com

針對XSS漏洞的前端防火墻:可疑模塊攔截

廈門紙業xmpaper.com

不過對于預警系統來說,能夠發現問題也足夠了,可以攔截風險那就再好不過。 中國破解cncrack.com

動態腳本攔截 MD5密碼在線加密解密破解cnmd5.com

剛剛測試了靜態腳本的攔截,取得了不錯的成績。但在動態創建的元素上,和我們先前猜測的一樣,MutationObserver 因優先級過低而無法攔截。 搜什么,找蝦米搜索xmsou.com

那就讓 DOMNodeInserted 來試試: 中國破解cncrack.com

  1. <script> 
  2.     document.addEventListener('DOMNodeInserted', function(e) {  
  3.         var node = e.target;  
  4.  
  5.         if (/xss/.test(node.src) || /xss/.test(node.innerHTML)) {  
  6.             node.parentNode.removeChild(node);  
  7.             console.log('攔截可疑模塊:', node);  
  8.         }  
  9.     }, true);  
  10. </script> 
  11.  
  12. <button id="btn">創建腳本</button> 
  13. <script> 
  14.     btn.onclick = function() {  
  15.         var el = document.createElement('script');  
  16.         el.src = 'http://www.etherdream.com/xss/out.js?dynamic';  
  17.         document.body.appendChild(el);  
  18.     };  
  19. </script> 

廈門色網xmsex.com 福建色網fjsex.com

Run

軟件下載就到soft.xmyy.com

遺憾的是,DOMNodeInserted 也沒能攔截動態腳本的執行 —— 盡管能檢測到。經過一番嘗試,所有瀏覽器都宣告失敗。

新名堂xmtang.com

當然,能實時預警已滿足我們的需求了。但若能攔截動態腳本,整套系統防御力就更高了。 廈門門戶網xmyy.com xmdoor.com

既然無法通過監控節點掛載來攔截,我們不妨換一條路。問題總有解決的方案,就看簡單與否。

廈門紙業xmpaper.com

屬性攔截

中國破解cncrack.com

仔細分析動態腳本創建的所有步驟: 廈門門戶網xmyy.com xmdoor.com

  1. var el = document.createElement('script');  
  2. el.src = 'http://www.etherdream.com/xss/out.js?dynamic';  
  3. document.body.appendChild(el); 
廈門門戶網xmyy.com xmdoor.com

是哪一步觸發了掛載事件?顯然是最后行。要獲得比它更高的優先級,我們只能往前尋找。 軟件下載就到soft.xmyy.com

既然是動態創建腳本,賦予它 src 屬性必不可少。如果創建腳本只為賦值 innerHTML 的話,還不如直接 eval 代碼更簡單。

MD5密碼在線加密解密破解cnmd5.com

如果能在屬性賦值時進行攔截,那么我們即可阻止賦予可疑的 src 屬性。

找工作、找人才,就上廈門人才市場網站xmrcsc.com

類似 IE 有個 onpropertychange 事件,HTML5 里面也是有屬性監聽接口的,并且就是剛剛我們使用的那個:MutationEvent。甚至還是那兩套方案:DOMAttrModified 和 MutationObserver。 廈門色網xmsex.com 福建色網fjsex.com

在根節點上監聽屬性變化,肯定會大幅影響頁面的性能,但我們還是先來看看是否可行。

網址導航就用ok118.com

先嘗試 MutationObserver:

網址導航就用ok118.com

  1. var observer = new MutationObserver(function(mutations) {  
  2.     console.log(mutations);  
  3. });  
  4. observer.observe(document, {  
  5.     subtree: true,  
  6.     attributes: true  
  7. });  
  8.  
  9. var el = document.createElement('script');  
  10. el.src = 'http://www.etherdream.com/xss/out.js?dynamic';  
  11. document.body.appendChild(el); 
中國破解cncrack.com

站外腳本執行了,但奇怪的是,回調卻沒有觸發。原來,我們監控的是 document 下的元素,而腳本賦值時還處于離屏狀態,顯然無法將事件冒泡上來。 廈門色網xmsex.com 福建色網fjsex.com

如果我們先 appendChild 再賦值 src 屬性,倒是可以捕獲到。但現實中調用順序完全不是我們說了算的。 MD5密碼在線加密解密破解cnmd5.com

同樣的,DOMAttrModified 也有這問題。

軟件下載就到soft.xmyy.com

看來,事件這條路的局限性太大,我們得另辟蹊徑。 網址導航就用ok118.com

API 攔截 廈門博愛xmboai.com

監控屬性賦值的方式肯定不會錯,只是我們不能再用事件那套機制了。 中國破解cncrack.com

想在修改屬性時觸發函數調用,除了事件外,另一個在傳統語言里經常用到的、并且主流 JavaScript 也支持的,那就是Setter 訪問器。 搜什么,找蝦米搜索xmsou.com

當我們設置腳本元素 src 屬性時,理論上說 HTMLScriptElement.prototype.src 這個訪問器將被調用。如果我們重寫這個訪問器,即可在設置腳本路徑時將其攔截。

軟件下載就到soft.xmyy.com

  1. <script> 
  2.     HTMLScriptElement.prototype.__defineSetter__('src', function(url) {  
  3.         console.log('設置路徑:', url);  
  4.     });  
  5. </script> 
  6.  
  7. <button id="btn">創建腳本</button> 
  8. <script> 
  9.     btn.onclick = function() {  
  10.         var el = document.createElement('script');  
  11.         el.src = 'http://www.etherdream.com/xss/out.js?dynamic';  
  12.         document.body.appendChild(el);  
  13.     };  
  14. </script> 
廈門門戶網xmyy.com xmdoor.com

Run 廈門色網xmsex.com 福建色網fjsex.com

如果這套方案可行的話,一切都將迎刃而解。而且我們只監聽腳本元素的 src 賦值,其他元素和屬性則完全不受影響,因此性能得到極大提升。

廈門臺球xmpool.com

經測試,FireFox 和 IE 瀏覽器完全可行。我們事先保存原始的 setter 變量,然后根據策略,決定是否向上調用。 中國破解cncrack.com

  1. <script> 
  2.     var raw_setter = HTMLScriptElement.prototype.__lookupSetter__('src');  
  3.  
  4.     HTMLScriptElement.prototype.__defineSetter__('src', function(url) {  
  5.         if (/xss/.test(url)) {  
  6.             if (confirm('試圖加載可疑模塊:\n\n' + url + '\n\n是否攔截?')) {  
  7.                 return;  
  8.             }                 
  9.         }  
  10.         raw_setter.call(this, url);  
  11.     });  
  12. </script> 
  13.  
  14. <button id="btn">創建腳本</button> 
  15. <script> 
  16.     btn.onclick = function() {  
  17.         var el = document.createElement('script');  
  18.         el.src = 'http://www.etherdream.com/xss/out.js?dynamic';  
  19.         document.body.appendChild(el);  
  20.     };  
  21. </script> 

軟件下載就到soft.xmyy.com

Run

中國破解cncrack.com

針對XSS漏洞的前端防火墻:可疑模塊攔截 廈門門戶網xmyy.com xmdoor.com

效果非常漂亮,然而現實卻令人遺憾 —— 我們的主流瀏覽器 Chrome 并不支持。由于無法操作原生訪問器,即使在原型鏈上重寫了 setter,實際賦值時仍不會調用我們的監控程序。 廈門色網xmsex.com 福建色網fjsex.com

先不急,若是拋棄原型鏈,直接在元素實例上定義訪問器又會如何? 廈門紙業xmpaper.com

  1. <button id="btn">創建腳本</button> 
  2. <script> 
  3.     btn.onclick = function() {  
  4.         var el = document.createElement('script');  
  5.  
  6.         el.__defineSetter__('src', function(url) {  
  7.             console.log('設置路徑:', url);  
  8.         });  
  9.  
  10.         el.src = 'http://www.etherdream.com/xss/out.js?dynamic';  
  11.         document.body.appendChild(el);  
  12.     };  
  13. </script> 
廈門色網xmsex.com 福建色網fjsex.com

run 廈門紙業xmpaper.com

這一回,Chrome 終于可以了。 廈門博愛xmboai.com

針對XSS漏洞的前端防火墻:可疑模塊攔截 廈門門戶網xmyy.com xmdoor.com

然而,這僅僅是測試。現實中哪有這樣的機會,供我們裝上訪問器呢。 中國破解cncrack.com

因此,我們只能把主動防御的時機再往前推,在元素創建時就調用我們的防御代碼。我們得重寫 createElement 這些能創建元素 API,只有這樣,才能第一時間里,給實例裝上我們的鉤子程序,為 Chrome 實現動態模塊的防御:

廈門色網xmsex.com 福建色網fjsex.com

  1. <script> 
  2.     // for chrome  
  3.     var raw_fn = Document.prototype.createElement;  
  4.  
  5.     Document.prototype.createElement = function() {  
  6.  
  7.         // 調用原生函數  
  8.         var element = raw_fn.apply(this, arguments);  
  9.  
  10.         // 為腳本元素安裝屬性鉤子  
  11.         if (element.tagName == 'SCRIPT') {  
  12.             element.__defineSetter__('src', function(url) {  
  13.                 console.log('設置路徑:', url);  
  14.             });  
  15.         }  
  16.  
  17.         // 返回元素實例  
  18.         return element;  
  19.     };  
  20. </script> 
  21.  
  22. <button id="btn">創建腳本</button> 
  23. <script> 
  24.     btn.onclick = function() {  
  25.         var el = document.createElement('script');  
  26.         el.src = 'http://www.etherdream.com/xss/out.js?dynamic';  
  27.         document.body.appendChild(el);  
  28.     };  
  29. </script> 
廈門門戶網xmyy.com xmdoor.com

Run

新名堂xmtang.com

這樣,當元素創建時,就已帶有我們的屬性掃描程序了,Chrome 不支持的問題也迎刃而解。 網址導航就用ok118.com

事實上,除了重寫 property 訪問器,我們還得考慮通過 setAttribute 賦值 src 的情況。因此需整理出一套完善的瀏覽器鉤子程序。

新名堂xmtang.com

重寫原生 API 看似很簡單,但如何才能打造出一個無懈可擊的鉤子系統呢?明天繼續講解。

新名堂xmtang.com

標簽(Tag):XSS漏洞  xss  前端防護  
官方郵箱:[email protected] 官方微信:xmyy_com 官方微博:
 
  • 掃描二維碼關注官方微信

山东十一选五走势图360