2013-01-25 92 views
6

問題沒有從這個出現:
Why does the browser modify the ID of an HTML element that contains &#x?此代碼是否容易受到XSS攻擊?

考慮到以下網頁:

<html> 
    <head> 
    <script type="text/javascript"> 
     // -------------------------------------------------------- 
     // could calling this method produce an XSS attack? 
     // -------------------------------------------------------- 
     function decodeEntity(text){ 
     text = text.replace(/<(.*?)>/g,''); // strip out all HTML tags, to prevent possible XSS 
     var div = document.createElement('div'); 
     div.innerHTML = text; 
     return div.textContent?div.textContent:div.innerText; 
     } 
     function echoValue(){ 
     var e = document.getElementById(decodeEntity("/path/&#x24;whatever")); 
     if(e) { 
      alert(e.innerHTML); 
     } 
     else { 
      alert("not found\n"); 
     } 
     } 
    </script> 
    </head> 
    <body> 
    <p id="/path/&#x24;whatever">The Value</p> 
    <button onclick="echoValue()">Tell me</button> 
    </body> 
</html> 

<p>元素的id包含爲了防止XSS攻擊了逃脫字符。 HTML部分和JS部分由服務器生成,服務器在兩個部分插入相同的轉義值(可能來自不安全的源)。

服務器逸出在&#x格式以下字符範圍:

  • 爲0x00 – 0x2D
  • 0x3A – 0x40的
  • 0x5B – 0x5E
  • 0x60的
  • 0x7B – 0xFF的
  • 0x0100 – 0xFFFF的

換句話說:是逃過字符只有:

  • 器0x2E – 0x39(./
  • 的0x41 – 0x5A(AZ
  • 0x5F(_
  • 0x61 – 0x7A(az

現在,我得通過JavaScript訪問該<p>。引用問題中的函數echoValue()始終失敗,因爲瀏覽器在HTML部分中將&#x24;轉換爲$,但在JS部分中將其保留爲&#x24;

因此,Gareth想出了an answer這是簡單和有效的。

我擔心的是,當使用參考答案中提供的decodeEntity()函數時,通過轉義動態字符串消除的XSS攻擊的可能性將再次出現。

可能有人指出是否可能有安全問題(哪個?)否(爲什麼不呢?)?

+0

只是讓服務器不在腳本內部轉義它。 – Bergi

回答

4

我首先建議你看看下面的鏈接中的Javascript討論JavaScript和XSS HTML衛生:

安全課沒有1: 不要重新發明輪子。如果之前已經完成了某些工作,那麼他們可能比您的臨時解決方案做得更好。

即使我不能從我的頭頂找到一種方法來利用你的簡單正則表達式,我不信任它真正捕獲所有情況。第一個鏈接提供了一個更詳細的解決方案,並且已經過徹底的審查和測試。我建議你看看XSS Filter Evasion Cheat Sheet。告訴你真正的好人可能想出什麼樣的討厭的東西。

+2

只是一個觀察...兩個鏈接都將轉到相同的URL。也許這不是故意的。 –

0

你申請輸入可能導致這種攻擊失敗,但假設任意輸入到decodeEntity額外的限制,這裏的運行腳本的例子:

decodeEntity("<img onerror='alert(\"test\")'\nsrc='test'>") 

這運行,因爲/<(.*?)>/只有在匹配<>在同一行上。

相關問題