來源:SegmentFault 思否社區
作者:乘著風
XSS(Cross Site Scripting)跨站點腳本是一種代碼注入攻擊,攻擊者利用Web站點的代碼漏洞,在用戶訪問的網頁時運行植入的惡意JS腳本,從而影響用戶訪問或竊取用戶信息。
XSS分類根據惡意腳本的觸發方式,XSS攻擊可分成三種形式,分別是反射型,存儲型和DOM型。
反射型XSS:客戶端的提交的內容中帶XSS腳本,伺服器端處理不當,直接在頁面上輸出內容,導致惡意代碼被執行。例如:惡意用戶在頁面中的文本框中輸入腳本代碼,表單提交後,伺服器程序未對文本框數據進行轉義處理,直接列印到頁面上,頁面返回到客戶端展示時,觸髮腳本執行。
存儲型XSS:攻擊者向系統中注入惡意代碼,惡意代碼在資料庫中保存,用戶訪問從資料庫中讀取的內容生成的頁面時,觸發惡意代碼執行。例如:惡意用戶在論壇發帖內容中包含腳本代碼,發帖內容提交後保存到伺服器資料庫中,當其他用戶瀏覽此帖子時,從資料庫中讀取帖子內容展示,帖子內容觸髮腳本在瀏覽器中執行。
DOM型XSS:反射型XSS類似,區別在於帶惡意代碼的數據不通過伺服器端處理,直接由客戶端JS腳本處理(DOM樹操作)時,觸發惡意代碼執行。例如:惡意用戶在URL參數中植入腳本,用戶點擊URL在瀏覽器打開後,JS讀取有腳本的參數,未做適當處理,觸髮腳本執行。
DOM型XSS在不需要和伺服器交互情況下,客戶端JS腳本可以在瀏覽器中直接查找、操作(增刪改)DOM模型的元素。同時也能讀取用戶在瀏覽器的輸入,如URL對象、location對象,並提取相關的參數。如果用戶輸入的內容總包含惡意腳本,而程序沒有進行有效的處理和過濾(如把傳輸數據直接交給eval執行),就會導致DOM型XSS攻擊。
攻擊示例以下示例代碼中,JS代碼從瀏覽器URL中讀取param參數,未經校驗和處理,直接寫入document中,如果參數內容中夾帶可執行的JS腳本塊,腳本就會直接執行。
<!--dom_xss_sample.html--><!DOCTYPE html><html><head> <title>DOM XSS</title></head><body> <p>DOM XSS攻擊示例</p></body><script> var pos=document.URL.indexOf("param=") + 6; document.write(decodeURI(document.URL.substring(pos,document.URL.length)));</script></html>在URL中,增加param=<script>alert(0)</script>參數,參數內容通過document.write直接寫入到頁面中。除了直接在參數中帶顯而易見的腳本外,在其他標籤中夾雜可執行的事件也是常見方式,如在img標籤的onerror事件中執行腳本。示例如下:param=<img src="null" onerror="alert('1')" />
從以上示例中可以看出,造成DOM型XSS漏洞攻擊,主要有兩個過程:
其中,輸入除了上述document.URL,還包括如下數據源:
對輸入的處理,除了上述document.write,還包括如下方法:
document.forms[0].action=…document.location.hostname=…document.location.replace(…)document.location.assign(…)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
點擊左下角閱讀原文,到 SegmentFault 思否社區 和文章作者展開更多互動和交流。