01
XSS跨站腳本介紹
跨站腳本(Cross-Site Scripting,XSS)是一種經常出現在Web應用程序中的計算機安全漏洞,是由于Web應用程序對用戶的輸入過濾不足而產生的。攻擊者利用網站漏洞把惡意的腳本代碼(通常包括html代碼和客戶端JAVAscript腳本)注入到網頁之中,當其他用戶瀏覽這些網頁時,就會執行其中的惡意代碼,對受害者可能采取Cookie資料竊取、會話劫持、釣魚欺騙等各種攻擊。
XSS跨站腳本攻擊本身對Web服務器沒有直接危害,它借助網站進行傳播,使網站的大量用戶受到攻擊。攻擊者一般通過留言、電子郵件或其他途徑向受害者發送一個精心構造的惡意URL,當受害者在Web瀏覽器中打開該URL的時候,惡意腳本會在受害者的計算機上悄悄運行,流程如圖所示:
點擊添加圖片描述(最多60個字)
02
XSS的危害
1.網絡釣魚,包括盜取各類用戶賬號;
2.竊取用戶cookies資料,從而獲取用戶隱私信息,或利用用戶身份進一步對網站執行操作;
3.劫持用戶(瀏覽器)會話,從而執行任意操作,例如進行非法轉賬、強制發表日志、發送電子郵件等;
4.強制彈出廣告頁面、刷流量等;
5.網頁掛馬;
6.進行惡意操作,例如任意篡改頁面信息、刪除文章等;
7.進行大量的客戶端攻擊,如DDoS攻擊;
8.結合其他漏洞,如CSRF漏洞,實施進一步作惡;
9.傳播跨站腳本蠕蟲等。
03
XSS的原理及案例
XSS根據其特性和利用手法的不同,只要分成兩大類型:一種是反射型跨站腳本;另一種是持久型跨站腳本。
1.反射型XSS
反射型跨站腳本也稱作非持久型、參數型跨站腳本。這種類型的跨站腳本是最常見的,也是使用最廣的一種,主要用于將惡意腳本附加到URL地址的參數中,例如:
http://www.test.com/search.php?key=”><script>alter(“XSS”)</script>
http://www.test.com/logout.asp?out=1&ur1=JavaScript:alert(document.cookie)
反射型XSS的利用一般是攻擊者通過特定手法(比如利用電子郵件),誘惑用戶去訪問一個包含惡意代碼的URL,當受害者單擊這些專門設計的鏈接的時候,惡意JavaScript代碼會直接在受害者主機上的瀏覽器執行。它的特點是只在用戶單擊時觸發,而且只執行一次,非持久化,所以稱為反射型跨站式腳本。
反射型XSS的攻擊流程如圖所示:
此類XSS通常出現在網站的搜索欄、用戶登入口等地方,常用來竊取客戶端Cookies或進行釣魚欺騙。
如下為反射型XSS的一個案例:當在該網站的姓名提交框內輸入惡意的JavaScript腳本時,點擊提交按鈕,便出現了反射型XSS攻擊,如圖所示:
點擊添加圖片描述(最多60個字)
點擊添加圖片描述(最多60個字)
反射型XSS的危害往往不如持久型XSS,因為惡意代碼暴露在URL參數中,并且時刻要求用戶單擊方可觸發,稍微有點安全意識的用戶可以輕易看穿鏈接是不可信任的。如此一來,反射型XSS攻擊的成本要比持久型XSS高得多。
2.持久型XSS
持久型跨站腳本也等于存儲型跨站腳本,比反射型跨站腳本更具威脅性,并且可能影響到Web服務器自身的安全。
此類XSS不需要用戶單擊特定的URL就能執行跨站腳本,攻擊者事先將惡意JavaScript代碼上傳或存儲到漏洞服務器中,只要受害者瀏覽包含此惡意JavaScript代碼的頁面就會執行惡意代碼。
持久型XSS的攻擊流程如圖所示:
點擊添加圖片描述(最多60個字)
持久型XSS一般出現在網站的留言、評論。博客日志等交互處,惡意腳本被存儲到客戶端或者服務器的數據庫中,當其他用戶瀏覽該網頁時,站點即從數據庫中讀取惡意用戶存入的非法數據,然后顯示在頁面中,即在受害者主機上的瀏覽器執行惡意代碼。
如下為持久型XSS的一個案例:當攻擊者在留言框內輸入惡意JavaScript代碼并提交后,其他用戶再瀏覽這個頁面時,就會發生持久型XSS攻擊,如圖所示:
點擊添加圖片描述(最多60個字)
持久型XSS不需要用戶去單擊URL進行觸發,所以他的危害比反射型XSS大,黑客可以利用它滲透網站、掛馬、釣魚……
04
XSS防御方案
XSS 漏洞是由于對用戶提交的數據沒有經過嚴格的過濾處理造成的,所以防御的原則就是不相信用戶輸入的數據,對輸入進行過濾,對輸出進行編碼。
1.使用XSS Filter
對用戶提交的信息進行有效的驗證,僅接受指定長度范圍內的,采用適當格式的內容提交,阻止或者忽略此外的其他任何數據。此外,還需過濾有效的和凈化有害的輸入。
例如:
? 表單數據指定值的類型:年齡只能是 int 、name 只能是字母數字等。
? 過濾或移除特殊的 html 標簽:<script>、<iframe>等。
? 過濾 js 事件的標簽:onclick、onerror、onfocus等。
2.使用編碼(HTMLEncode)
HTML編碼在防止XSS攻擊上可以起到很大的作用,它主要是用對應的HTML實體替代字面量字符,這樣做可確保瀏覽器安全處理可能存在的惡意字符,將其當做HTML文檔的內容而非結構加以處理。
一些常見的可能造成問題的字符的HTML編碼如表所示:
3、JavaScript編碼
這條原則主要針對動態生成的JavaScript代碼,這包括腳本部分以及HTML標簽的事件處理屬性(如onerror, onload等)。在往JavaScript代碼里插入數據的時候,只有一種情況是安全的,那就是對不可信數據進行JavaScript編碼,并且只把這些數據放到使用引號包圍起來的值部分(data value)之中,除了上面的那些轉義之外,還要附加上下面的轉義:
轉成 \
/ 轉成 /
; 轉成 ;(全角;)
4、Http Only cookie
許多 XSS 攻擊的目的就是為了獲取用戶的cookie,將重要的 cookie 標記為http only,這樣的話當瀏覽器向服務端發起請求時就會帶上cookie字段,但是在腳本中卻不能訪問 cookie,這樣就避免了XSS攻擊利用JavaScript的document.cookie獲取cookie。