1. 程式人生 > >XXx外網檢測到目標URL存在基於DOM的跨站指令碼漏洞

XXx外網檢測到目標URL存在基於DOM的跨站指令碼漏洞

為了配合XXx入口網站等級保護,xxx購置了xx的漏洞掃描伺服器。經過掃描,發現我們外網WEB伺服器上有一個檢測到目標URL存在基於DOM的跨站指令碼漏洞,具體請見附件。諮詢過xx技術人員,他們的說法是外網WEB上的部關程式碼不符合規範。

這個外網算起來很老了,維護階段出現這種東西,有點暈,畢竟不是自己寫的程式碼。

以前很少去注意這些東西,這個到底是怎麼回事呢。在網上找了篇文章,有什麼疑問的話會做解答。

1、那到底什麼是跨站指令碼漏洞呢?

跨站指令碼漏洞(Cross Site Scripting,常簡寫作XSS)是Web應用程式在將資料輸出到網頁的時候存在問題,導致攻擊者可以將構造的惡意資料顯示在頁面的漏洞。因為跨站指令碼攻擊都是向網頁內容中寫入一段惡意的指令碼或者HTML程式碼,故跨站指令碼漏洞也被叫做HTML注入漏洞(HTML Injection)。 與SQL注入攻擊資料庫伺服器的方式不同,跨站指令碼漏洞是在客戶端發動造成攻擊,也就是說,利用跨站指令碼漏洞注入的惡意程式碼是在使用者電腦上的瀏覽器中執行的。

2、有什麼危害?

跨站指令碼攻擊注入的惡意程式碼執行在瀏覽器中,所以對使用者的危害是巨大的——也需要看特定的場景:跨站指令碼漏洞存在於一個無人訪問的小站幾乎毫無價值,但對於擁有大量使用者的站點來說卻是致命的。
最典型的場景是,黑客可以利用跨站指令碼漏洞盜取使用者Cookie而得到使用者在該站點的身份許可權。據筆者所知,網上就有地下黑客通過出售未公開的GMail、雅虎郵箱及hotmail的跨站指令碼漏洞牟利。
由於惡意程式碼會注入到瀏覽器中執行,所以跨站指令碼漏洞還有一個較為嚴重的安全威脅是被黑客用來製造欺詐頁面實現釣魚攻擊。這種攻擊方式直接利用目標網站的漏洞,比直接做一個假冒網站更具欺騙性。
另外,控制了使用者的瀏覽器,黑客還可以獲取使用者計算機資訊、截獲使用者鍵盤輸入、刺探使用者所處區域網資訊甚至對其他網站進行GET Flood攻擊。目前網際網路已經有此類利用跨站指令碼漏洞控制使用者瀏覽器的黑客工具出現。
當然,雖然跨站指令碼攻擊是在客戶端瀏覽器進行,但是最終也是可以攻擊伺服器的。筆者就曾在安全測試過程中就利用某Blog程式的跨站指令碼漏洞得到網站管理員身份並最終控制Web伺服器。

3、這個是怎麼產生的呢?

看了些文章,產生的方式無非就這幾種。一是url要傳引數,如果引數中含有<script>這樣的指令碼 ,而又沒有對這些個引數進行處理的話,就會在頁面中執行這個指令碼,從而。。。還有就是,頁面中使用document.write,如果這個裡面含有< > ‘ 等一系列的符號時,會對頁面造成影響 。等等啦,想知道更多,去看參考文章吧。

下面是掃描工具給出報告的選段:

詳細描述:基於DOM的跨站指令碼漏洞屬於跨站漏洞的一種分類。造成跨站的原因是客戶端指令碼(一般是javascript)處理使用者輸入時,沒有做充分的過濾,並且將使用者的輸入賦給DOM樹中某些物件的屬性,比如通過document.write,window.location等。這些操作支援執行javascript,造成使用者的輸入被執行。
比如:
<HTML>
<TITLE>Welcome!</TITLE>
Hello,
<SCRIPT>
var pos=document.URL.indexOf(“name=”)+5;
document.write(document.URL.substring(pos,document.URL.length));
</SCRIPT>
<BR>
Welcome!!!
</HTML>
這個HTML頁面顯示歡迎資訊。
當請求http://[SERVER]]/welcome.html?name=<script>alert(document.cookie)</script>,伺服器的響應內容並沒有包含<script>alert(document.cookie)</script>,但是通過document.write修改DOM樹,導致使用者的輸入被執行,造成跨站指令碼漏洞。

解決辦法:請分析並加強客戶端 (JavaScript) 程式碼。 處理攻擊者所能影響的輸入源,通常是url,例如:document.URL,document.URLUnencoded,document.location(及其許多屬性,document.referrer ,window.location(及其許多屬性)

檢查頁面中是否使用了以下程式碼作為輸出:
* document.write(…)
* document.writeln(…)
* document.body.innerHtml=…

- 直接修改 DOM(包括 DHTML 事件),例如:
* document.forms[0].action=…(以及各種其他集合) * document.attachEvent(…)
* document.create…(…)
* document.execCommand(…)
* document.body. …(通過主體物件訪問 DOM)
* window.attachEvent(…)

- 替換頁面URL,例如:
* document.location=…(以及指派給位置的 href、主機和主機名)
* document.location.hostname=…
* document.location.replace(…)
* document.location.assign(…)
* document.URL=…
* window.navigate(…)

- 開啟/修改視窗,例如:
* document.open(…)
* window.open(…)
* window.location.href=… (以及指派給位置的 href、主機和主機名)

- 直接執行指令碼,例如: * eval(…)
* window.execScript(…)
* window.setInterval(…)
* window.setTimeout(…)

我們這個外網的情況就是:

[plain]

URL:

http://www.abc.cn/123/201102/t1234.html#’”><script>alert(/xss/)</script>

或者

http://www.abc.cn/123/201102/t1234.html?var=xss’”><script>alert(/xss/)</script>

[/plain]

而頁面中用了window.location.href

[html]

<script type=”text/javascript”>

var str = ‘<?hello>’;

var str2 = window.location.href;

var link_href = str+’&url=’+str2;

document.write(“<a href=’”+link_href+”‘ class=’A14H’ target=’_blank’>點選提問</a>”);

</script>

[/html]

上面這些程式碼一個是會執行script(alert會執行),再就是有個單引號會導致標籤提早閉合,導致頁面難看。

鑑於外網多是靜態檔案,且不用傳參,我直接把window.location.href換成了window.location.protocol+”//”+window.location.hostname+window.location.pathname,情況解決。

當然了,更好的解決辦法在於對url的編碼。

<編碼為&lt;

>編碼為&gt;

“編碼為&quot;

‘編碼為&#39;

實際上需要用單引號(’)閉合JavaScript程式碼,這裡就需要按照JavaScript的語法把單引號轉義: ‘ 轉義為 \’