1. 程式人生 > >Web安全——XSS指令碼注入攻擊

Web安全——XSS指令碼注入攻擊

好久不發文章,我表示…我還活著。
只不過最近在寫Git-books,所以忽略了我的這個部落格。這兩天在看Web安全相關的東西,覺得確實有意思。

XSS跨站指令碼攻擊

XSS 意為跨站指令碼攻擊(Cross Site Scripting),縮寫應該是CSS,但是已經有了一個層疊樣式表(Cascading Style Sheets),所以就叫它XSS了。惡意攻擊者往Web頁面裡插入惡意Script程式碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的Script程式碼會被執行,從而達到惡意攻擊使用者的目的,最常見的就是拿到攻擊者的 Cookie 然後就可以登入別人的賬號了。

清單 1. 存在 DOM based XSS 的 HTML 程式碼

<HTML>
<TITLE>Welcome!</TITLE>
Hi
<SCRIPT>
 var pos=document.URL.indexOf("name=")+5;
 document.write(document.URL.substring(pos,document.URL.length));
</SCRIPT>
<BR>
Welcome to our system
…
</HTML>

按照該頁面 JavaScript 程式碼邏輯,它會接受 URL 中傳入的 name 引數並展示歡迎資訊,如清單 2 所示:

清單 2. 正常情況下的訪問 URL

http://www.vulnerable.site/welcome.html?name=Jeremy

清單 3. 訪問 URL 中注入指令碼

http://www.vulnerable.site/welcome.html?name=<script>alert(document.cookie)</script>

值得關注的是,通過以上示例可以看出,惡意程式碼不需要嵌入伺服器的響應中,基於 DOM 的跨站點指令碼編制攻擊也能成功。可能某些讀者會認為:目前主流瀏覽器會自動轉義 URL 中的 ‘<’ 和 ‘>’ 符號,轉義後的注入指令碼就不會被執行了,基於 DOM 的跨站點指令碼編制也就不再有什麼威脅了。這句話前半段是對的,但後半段就不準確了。我們要意識到攻擊者可以很輕鬆地繞過瀏覽器對 URL 的轉義,譬如攻擊者可以利用錨點 ‘#’ 來欺騙瀏覽器,如清單 4 所示。瀏覽器會認為 ‘#’ 後面的都是片段資訊,將不會做任何處理。

http://www.vulnerable.site/welcome.html#?name=<script>alert(document.cookie)</script>

測試:
chrome可以攔截XSS:
這裡寫圖片描述
IE不行
這裡寫圖片描述