XSS跨站點(diǎn)腳漏洞概述
來源:SegmentFault 思否社區(qū)
作者:乘著風(fēng)
XSS(Cross Site Scripting)跨站點(diǎn)腳本是一種代碼注入攻擊,攻擊者利用Web站點(diǎn)的代碼漏洞,在用戶訪問的網(wǎng)頁時(shí)運(yùn)行植入的惡意JS腳本,從而影響用戶訪問或竊取用戶信息。
XSS分類
根據(jù)惡意腳本的觸發(fā)方式,XSS攻擊可分成三種形式,分別是反射型,存儲型和DOM型。
反射型XSS:客戶端的提交的內(nèi)容中帶XSS腳本,服務(wù)器端處理不當(dāng),直接在頁面上輸出內(nèi)容,導(dǎo)致惡意代碼被執(zhí)行。
例如:惡意用戶在頁面中的文本框中輸入腳本代碼,表單提交后,服務(wù)器程序未對文本框數(shù)據(jù)進(jìn)行轉(zhuǎn)義處理,直接打印到頁面上,頁面返回到客戶端展示時(shí),觸發(fā)腳本執(zhí)行。
存儲型XSS:攻擊者向系統(tǒng)中注入惡意代碼,惡意代碼在數(shù)據(jù)庫中保存,用戶訪問從數(shù)據(jù)庫中讀取的內(nèi)容生成的頁面時(shí),觸發(fā)惡意代碼執(zhí)行。
例如:惡意用戶在論壇發(fā)帖內(nèi)容中包含腳本代碼,發(fā)帖內(nèi)容提交后保存到服務(wù)器數(shù)據(jù)庫中,當(dāng)其他用戶瀏覽此帖子時(shí),從數(shù)據(jù)庫中讀取帖子內(nèi)容展示,帖子內(nèi)容觸發(fā)腳本在瀏覽器中執(zhí)行。
DOM型XSS:反射型XSS類似,區(qū)別在于帶惡意代碼的數(shù)據(jù)不通過服務(wù)器端處理,直接由客戶端JS腳本處理(DOM樹操作)時(shí),觸發(fā)惡意代碼執(zhí)行。
例如:惡意用戶在URL參數(shù)中植入腳本,用戶點(diǎn)擊URL在瀏覽器打開后,JS讀取有腳本的參數(shù),未做適當(dāng)處理,觸發(fā)腳本執(zhí)行。
DOM型XSS
在不需要和服務(wù)器交互情況下,客戶端JS腳本可以在瀏覽器中直接查找、操作(增刪改)DOM模型的元素。同時(shí)也能讀取用戶在瀏覽器的輸入,如URL對象、location對象,并提取相關(guān)的參數(shù)。如果用戶輸入的內(nèi)容總包含惡意腳本,而程序沒有進(jìn)行有效的處理和過濾(如把傳輸數(shù)據(jù)直接交給eval執(zhí)行),就會導(dǎo)致DOM型XSS攻擊。
攻擊示例
網(wǎng)頁代碼
以下示例代碼中,JS代碼從瀏覽器URL中讀取param參數(shù),未經(jīng)校驗(yàn)和處理,直接寫入document中,如果參數(shù)內(nèi)容中夾帶可執(zhí)行的JS腳本塊,腳本就會直接執(zhí)行。
DOM XSS DOM XSS攻擊示例
運(yùn)行效果
在URL中,增加param=參數(shù),參數(shù)內(nèi)容通過document.write直接寫入到頁面中。

參數(shù)中的腳本代碼塊直接執(zhí)行,觸發(fā)XSS攻擊。

除了直接在參數(shù)中帶顯而易見的腳本外,在其他標(biāo)簽中夾雜可執(zhí)行的事件也是常見方式,如在img標(biāo)簽的onerror事件中執(zhí)行腳本。示例如下:param=
從以上示例中可以看出,造成DOM型XSS漏洞攻擊,主要有兩個(gè)過程:
在輸入的數(shù)據(jù)源中夾帶了惡意腳本 程序未對輸入進(jìn)行必要的處理,導(dǎo)致惡意腳本執(zhí)行
其中,輸入除了上述document.URL,還包括如下數(shù)據(jù)源:
document.URL document.URLUnencoded document.location document.referrer window.location location location.href location.search location.hash location.pathname
對輸入的處理,除了上述document.write,還包括如下方法:
直接執(zhí)行腳本類
eval(…) window.execScript(…) window.setInterval(…) window.setTimeout(…)
寫HTML頁面類
document.write(…) document.writeln(…) element.innerHTML(…)
直接修改DOM類
document.forms[0].action=… document.attachEvent(…) document.create…(…) document.execCommand(…) document.body. … window.attachEvent(…)
替換文檔URL類
document.location=… document.location.hostname=… document.location.replace(…) document.location.assign(…) document.URL=… window.navigate(…)
打開/修改窗口類
document.open(…) window.open(…) window.location.href=… (and assigning to location’s href, host and hostname)
更多的DOM型XSS攻擊方法,可參考如下文檔?DOM Based Cross Site Scripting or XSS of the Third Kind
防御方法
對于DOM型XSS的攻擊,OWASP組織提供了7條RULE和10條GUIDELINE,此處不再累贅,請參考官方原文DOM based XSS Prevention Cheat Sheet

