什么是跨站腳本?
跨站腳本(Cross-site scripting,簡稱XSS),是一種迫使Web站點回顯可執(zhí)行代碼的攻擊技術,而這些可執(zhí)行代碼由攻擊者提供、最終為用戶瀏覽器加載。不同于大多數(shù)攻擊(一般只涉及攻擊者和受害者),XSS涉及到三方,即攻擊者、客戶端與網(wǎng)站。XSS的攻擊目標是為了盜取客戶端的cookie或者其他網(wǎng)站用于識別客戶端身份的敏感信息。獲取到合法用戶的信息后,攻擊者甚至可以假冒最終用戶與網(wǎng)站進行交互。
XSS漏洞成因:是由于動態(tài)網(wǎng)頁的Web應用對用戶提交請求參數(shù)未做充分的檢查過濾,允許用戶在提交的數(shù)據(jù)中摻入HTML代碼(最主要的是“>”、“<”),然后未加編碼地輸出到第三方用戶的瀏覽器,這些攻擊者惡意提交代碼會被受害用戶的瀏覽器解釋執(zhí)行。
XSS存在哪些威脅?
攻擊者可以利用XSS漏洞、借助存在漏洞的Web網(wǎng)站攻擊其他瀏覽相關網(wǎng)頁的用戶,竊取用戶瀏覽會話中諸如用戶名和口令(可能包含在cookie里)的敏感信息、通過插入惡意代碼對用戶執(zhí)行掛馬攻擊。XSS漏洞還可能被攻擊者用于網(wǎng)頁篡改,只是多數(shù)情況為了經(jīng)濟利益最大化,攻擊者不會直接進行篡改。
XSS分為:存儲型 、反射型 、DOM型XSS
存儲型XSS:存儲型XSS,持久化,代碼是存儲在服務器中的,如在個人信息或發(fā)表文章等地方,插入代碼,如果沒有過濾或過濾不嚴,那么這些代碼將儲存到服務器中,用戶訪問該頁面的時候觸發(fā)代碼執(zhí)行。這種XSS比較危險,容易造成蠕蟲,盜竊cookie
反射型XSS:非持久化,需要欺騙用戶自己去點擊鏈接才能觸發(fā)XSS代碼(服務器中沒有這樣的頁面和內容),一般容易出現(xiàn)在搜索頁面。反射型XSS大多數(shù)是用來盜取用戶的Cookie信息。
DOM型XSS:不經(jīng)過后端,DOM-XSS漏洞是基于文檔對象模型(Document Objeet Model,DOM)的一種漏洞,DOM-XSS是通過url傳入?yún)?shù)去控制觸發(fā)的,其實也屬于反射型XSS。
可能觸發(fā)的DOM型XSS的屬性
1.document.referer
2.Window.name
3.Location
4.innerHTML
5.Document.write
例如:我們在URL中傳入?yún)?shù)的值,然后客戶端頁面通過js腳本利用DOM的方法獲得URL中參數(shù)的值,再通過DOM方法賦值給選擇列表,該過程沒有經(jīng)過后端,完全是在前端完成的。所以,我們就可以在我們輸入的參數(shù)上做手腳了。
XSS漏洞的挖掘
盡可能找到一切用戶可控并且能夠輸出在頁面代碼中的地方,比如:
1.URL的每一個參數(shù)
2.URL本身
3.表單
4.搜索框
常見的場景
1.重災區(qū):評論區(qū)、留言區(qū)、個人信息、訂單信息等
2.針對性:站內信、網(wǎng)頁即時通訊、私信、意見反饋等
3.存在風險:搜索框。當前目錄、圖片屬性等
XSS攻擊的過程:
反射性XSS漏洞
1.A經(jīng)常瀏覽某個網(wǎng)站,此網(wǎng)站為B所擁有。B的站點需要A使用用戶名/密碼進行登錄,并存儲了A敏感信息(比如銀行帳戶信息)。
2.C發(fā)現(xiàn) B的站點存在反射性的XSS漏洞
3.C利用B網(wǎng)站的反射型XSS漏洞編寫了一個exp,做成鏈接的形式,并利用各種手段誘使A點擊
4.A在登錄到B的站點后,瀏覽了 C 提供的惡意鏈接
嵌入到惡意鏈接中的惡意腳本在A的瀏覽器中執(zhí)行。此腳本盜竊敏感信息(cookie、帳號信息等信息)。然后在A完全不知情的情況下將這些信息發(fā)送給 C。
5.C利用獲取到的cookie就可以以A的身份登錄B的站點,如果腳本的功更強大的話,C 還可以對A的瀏覽器做控制并進一步利用漏洞控制
存儲型XSS漏洞
1.B擁有一個Web站點,該站點允許用戶發(fā)布信息/瀏覽已發(fā)布的信息。
2.C檢測到B的站點存在存儲型的XSS漏洞。
3.C在B的網(wǎng)站上發(fā)布一個帶有惡意腳本的熱點信息,該熱點信息存儲在了B的服務器的數(shù)據(jù)庫中,然后吸引其它用戶來閱讀該熱點信息。
4.B或者是任何的其他人 如A瀏覽該信息之后,C的惡意腳本就會執(zhí)行。
- C的惡意腳本執(zhí)行后,C就可以對瀏覽器該頁面的用戶發(fā)動一起XSS攻擊
從網(wǎng)站開發(fā)者角度,如何讓防護XSS攻擊?
1.驗證所有輸入的數(shù)據(jù),有效檢測攻擊;
① 輸入驗證:某個數(shù)據(jù)被接受為可被顯示或存儲之前,使用標準輸入驗證機制,驗證所有輸入數(shù)據(jù)的長度、類型、語法以及業(yè)務規(guī)則。
2.對所有輸出數(shù)據(jù)進行適當?shù)木幋a,以防止任何已成功注入的腳本在瀏覽器端運行。
① 強壯的輸出編碼:數(shù)據(jù)輸出前,確保用戶提交的數(shù)據(jù)已被正確進行entity編碼,建議對所有字符進行編碼而不僅局限于某個子集。
② 明確指定輸出的編碼方式(如ISO 8859-1或 UTF 8):不要允許攻擊者為你的用戶選擇編碼方式。
從網(wǎng)站用戶角度,如何讓防護XSS攻擊?
當你打開一封Email或附件、瀏覽論壇帖子時,可能惡意腳本會自動執(zhí)行,因此,在做這些操作時一定要特別謹慎。建議在瀏覽器設置中關閉JavaScript。如果使用IE瀏覽器,將安全級別設置到“高。