一、XSS攻擊是什么
XSS是惡意攻擊者往 Web 頁面里插入惡意可執行網頁腳本代碼,當用戶瀏覽該頁之時,嵌入其中 Web 里面的腳本代碼會被執行,從而可以達到攻擊者盜取用戶信息或其他侵犯用戶安全隱私的目的。
二、XSS分類
- 反射型XSS
常見情況是攻擊者通過構造一個惡意鏈接的形式,誘導用戶傳播和打開, 由于鏈接內所攜帶的參數會回顯于頁面中或作為頁面的處理數據源,最終造成XSS攻擊。 - 存儲型XSS
存儲型XSS是持久化的XSS攻擊方式,將惡意代碼存儲于服務器端, 當其他用戶再次訪問頁面時觸發,造成XSS攻擊。
- dom型XSS
dom型XSS和反射型XSS類似,都是通過構造一個惡意鏈接的形式,誘導用戶傳播和打開,但是操作的對象是dom文檔
- SVGXSS
SVG(Scalable Vector Graphics)是一種基于XML的二維矢量圖格式,和我們平常用的jpg/png等圖片格式所不同的是SVG圖像在放大或改變尺寸的情況下其圖形質量不會有所損失,并且我們可以使用任何的文本編輯器打開SVG圖片并且編輯它,目前主流的瀏覽器都已經支持SVG圖片的渲染。為什么這樣的SVG圖片會造成跨站腳本問題呢?
這是因為SVG是支持通過腳本語言來動態訪問和修改SVG的任何內容,這點和HTML中的DOM類似,或者說完全一致。因為SVG中的所有標簽和屬性都已經對應了已經定義的DOM,而這種腳本語言就是JavaScript,所以我們在SVG中插入JavaScript腳本是完全能夠被解析的。
//我們在一張SVG圖片里面插入一個JavaScript代碼。我們用瀏覽器打開它會發現它會造成XSS。
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"><circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red" /><script>alert(1)</script>
</svg>
- PDFXSS
PDF是一次常見的電子文檔,攻擊者可以通過在PDF中插入惡意代碼(JavaScrip腳本)來實現PDF XSS攻擊。當用戶打開惡意的PDF,就會觸發惡意代碼,攻擊者可以利用PDF XSS攻擊來竊取用戶的敏感信息、篡改網站信息、實施釣魚等行為。 - SWFXSS
swf是flash的文件格式,flash有可以調用js的函數,也就是可以和js通信,因此這些函數如果使用不當就會造成xss。常見的可觸發xss的危險函數有:getURL,navigateToURL,ExternalInterface.call,htmlText,loadMovie等等
三、區別
- dom型XSS和反射型XSS的區別
二者同樣都是構造惡意的鏈接,但是反射型XSS數據需要流經服務器,但是dom型XSS不需要,操作的對象是本地的dom對象。 - 反射型XSS和存儲型XSS的區別
反射型XSS是一次性的,訪問一次惡意鏈接就執行一些,源頭來自構造的惡意代碼;存儲型XSS是持久型的,惡意代碼存儲在服務器,當訪問該數據時候就會執行。
四、繞過
五、有什么用
COOKIE盜取,憑據竊取,頁面劫持,網絡釣魚,權限維持
六、什么是HTML實體
HTML 實體是用于在 HTML 文檔中表示特殊字符的一種方式。在 HTML 里,有些字符具備特殊含義,像 < 和 > 分別用于定義 HTML 標簽的開始和結束。要是你直接在 HTML 文檔里使用這些字符,瀏覽器會把它們解析為 HTML 標簽的一部分,而非普通文本。所以,為了在 HTML 中顯示這些特殊字符,就得使用 HTML 實體。
實體的構成
HTML 實體由三部分構成:一個和號(&)、實體名稱或者實體編號、一個分號(;)。
- 實體名稱:是易于記憶的字符串,例如 lt 代表小于號(<),gt 代表大于號(>)。
- 實體編號:是對應的 Unicode 字符編碼,例如 < 表示小于號(<),> 表示大于號(>)。
六、漏洞利用
-
反射型XSS
-
存儲型XSS
-
Dom型XSS
-
PDF-XSS
用PDF編輯器(Adobe Acrobat Reader)打開PDF文件,然后在里面寫入js代碼,然后找到注入點,上傳PDF文件,若存在漏洞,訪問上傳的地址,即可觸發腳本 -
SWF-XSS
1、用Adobe Flash Professional編寫一個帶js腳本的惡意flash文件,然后找到注入點,上傳SWF文件,若存在漏洞,訪問上傳的地址,即可觸發腳本。
2、用JPEXS Free Flash Decompiler 反編譯工具,查看代碼,找到常見的可觸發xss的危險函數有:getURL,navigateToURL,ExternalInterface.call,htmlText,loadMovie等等,然后找到對應的注入點,嘗試注入惡意的js代碼。 -
SVG-XSS
用任意的文本編輯打開SVG文件,然后在里面寫入js代碼,然后找到注入點,上傳SVG文件,若存在漏洞,訪問上傳的地址,即可觸發腳本
七、漏洞利用工具
八、如何防范
-
字符過濾
字符過濾指的是對用戶輸入和輸出的數據進行檢查,把可能用于 XSS 攻擊的特殊字符過濾掉或者轉義。比如在 Web 應用里,當用戶提交表單時,要對輸入的內容進行檢查,把 <、>、"、’ 等字符轉換為 HTML 實體,防止攻擊者通過輸入惡意腳本來注入代碼。 -
實例化編碼
實例化編碼是將用戶輸入的數據進行編碼,讓其在瀏覽器中以文本形式呈現,而非作為代碼執行。像 HTML 實體編碼、URL 編碼等都是常見的編碼方式。在輸出用戶輸入內容時,對其進行 HTML 實體編碼,能避免瀏覽器將其中的特殊字符解釋為 HTML 標簽或腳本代碼。 -
http_only
HttpOnly 是一個用于設置 Cookie 的屬性。當一個 Cookie 被設置為 HttpOnly 后,它只能通過 HTTP 協議訪問,JavaScript 腳本無法對其進行讀寫操作。這樣就能防止攻擊者通過 XSS 攻擊竊取用戶的 Cookie 信息。 -
CSP防護
-
WAF攔截
waf內置很多漏洞監測庫,對于訪問的鏈接都會進行檢擦,若存在惡意鏈接會直接被禁用。