1. 程式人生 > >這一次,徹底理解XSS攻擊

這一次,徹底理解XSS攻擊

**希望讀完本文大家徹底理解XSS攻擊,如果讀完本文還不清楚,我請你吃飯慢慢告訴你~** 話不多說,我們進入正題。 # 一、簡述 跨站指令碼(Cross-site scripting,簡稱為:CSS, 但這會與層疊樣式表(Cascading Style Sheets,CSS)的縮寫混淆。因此,跨站指令碼攻擊縮寫為XSS)是一種網站應用程式的安全漏洞攻擊。 XSS攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令程式碼到網頁,使使用者載入並執行攻擊者惡意製造的網頁程式。這些惡意網頁程式通常是JavaScript,但實際上也可以包括Java、 VBScript、 LiveScript、ActiveX、 Flash 或者甚至是普通的HTML。攻擊成功後,攻擊者可能得到包括但不限於更高的許可權(如執行一些操作)、私密網頁內容、會話和cookie等各種內容。 # 二、XSS型別 最常見的幾種分類:**反射型(非持久型)XSS**、**儲存型(持久型)XSS**、**DOM型XSS**、**通用型XSS**、**突變型XSS**。 ## 反射型XSS 反射型XSS只是簡單的把使用者輸入的資料從伺服器反射給使用者瀏覽器,要利用這個漏洞,攻擊者必須以某種方式誘導使用者訪問一個精心設計的URL(惡意連結),才能實施攻擊。 舉例來說,當一個網站的程式碼中包含類似下面的語句: ```php hello,$_GET['user']

"; ?> ``` 如果未做防範XSS,使用者名稱設為``````,則會執行預設好的JavaScript程式碼。 ### 漏洞成因 當用戶的輸入或者一些使用者可控引數未經處理地輸出到頁面上,就容易產生XSS漏洞。主要場景有以下幾種: + 將不可信資料插入到HTML標籤之間時;// 例如div, p, td; + 將不可信資料插入到HTML屬性裡時;// 例如:`` + 將不可信資料插入到SCRIPT裡時;// 例如:`` + 還有插入到Style屬性裡的情況,同樣具有一定的危害性;// 例如`` + 將不可信資料插入到HTML URL裡時,// 例如:`` + 使用富文字時,沒有使用XSS規則引擎進行編碼過濾。 **對於以上的幾個場景,若服務端或者前端沒有做好防範措施,就會出現漏洞隱患。** ### 攻擊流程 反射型XSS通常出現在搜尋等功能中,需要被攻擊者點選對應的連結才能觸發,且受到XSS Auditor(chrome內建的XSS保護)、NoScript等防禦手段的影響較大,所以它的危害性較儲存型要小。 ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b53bf56086cd48988872c80c6db8f5ba~tplv-k3u1fbpfcp-zoom-1.image) ## 儲存型XSS ​ 儲存型(或 HTML 注入型/持久型)XSS 攻擊最常發生在由社群內容驅動的網站或 Web 郵件網站,不需要特製的連結來執行。黑客僅僅需要提交 XSS 漏洞利用程式碼(反射型XSS通常只在url中)到一個網站上其他使用者可能訪問的地方。這些地區可能是`部落格評論,使用者評論,留言板,聊天室,HTML 電子郵件,wikis`,和其他的許多地方。一旦使用者訪問受感染的頁,執行是自動的。 ### 漏洞成因 ​ 儲存型XSS漏洞的成因與反射型的根源類似,不同的是惡意程式碼會被儲存在伺服器中,導致其它使用者(前端)和管理員(前後端)在訪問資源時執行了惡意程式碼,使用者訪問伺服器-跨站連結-返回跨站程式碼。 ### 攻擊流程 ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/43b345fe21ab461b83c59dd304499851~tplv-k3u1fbpfcp-zoom-1.image) ## DOM型XSS 通過修改頁面的DOM節點形成的XSS,稱之為DOM Based XSS。 ### 漏洞成因 DOM型XSS是基於DOM文件物件模型的。對於瀏覽器來說,DOM文件就是一份XML文件,當有了這個標準的技術之後,通過JavaScript就可以輕鬆的訪問DOM。當確認客戶端程式碼中有DOM型XSS漏洞時,誘使(釣魚)一名使用者訪問自己構造的URL,利用步驟和反射型很類似,但是唯一的區別就是,構造的URL引數不用傳送到伺服器端,可以達到繞過WAF、躲避服務端的檢測效果。 ### 攻擊示例 ```html DOM Based XSS Demo
``` 在這段程式碼中,submit按鈕的onclick事件呼叫了xsstest()函式。而在xsstest()中,修改了頁面的DOM節點,通過innerHTML把一段使用者資料當作HTML寫入到頁面中,造成了DOM Based XSS。 ## 通用型XSS 通用型XSS,也叫做UXSS或者Universal XSS,全稱Universal Cross-Site Scripting。 上面三種XSS攻擊的是因為客戶端或服務端的程式碼開發不嚴謹等問題而存在漏洞的目標網站或者應用程式。這些攻擊的先決條件是訪問頁面存在漏洞,但是UXSS是一種利用瀏覽器或者瀏覽器擴充套件漏洞來製造產生XSS的條件並執行程式碼的一種攻擊型別。 ### 漏洞成因 Web瀏覽器是正在使用的最流行的應用程式之一,當一個新漏洞被發現的時候,不管自己利用還是說報告給官方,而這個過程中都有一段不小的時間,這一過程中漏洞都可能被利用於UXSS。 不僅是瀏覽器本身的漏洞,現在主流瀏覽器都支援擴充套件程式的安裝,而眾多的瀏覽器擴充套件程式可能導致帶來更多的漏洞和安全問題。因為UXSS攻擊不需要網站頁面本身存在漏洞,同時可能訪問其他安全無漏洞頁面,使得UXSS成為XSS裡危險和最具破壞性的攻擊型別之一。 ### 漏洞案例 #### IE6或火狐瀏覽器擴充套件程式Adobe Acrobat的漏洞 這是一個比較經典的例子。當使用擴充套件程式時導致錯誤,使得程式碼可以執行。這是一個在pdf閱讀器中的bug,允許攻擊者在客戶端執行指令碼。構造惡意頁面,寫入惡意指令碼,並利用擴充套件程式開啟pdf時執行程式碼。tefano Di Paola 和 Giorgio Fedon在一個在Mozilla Firefox瀏覽器Adobe Reader的外掛中可利用的缺陷中第一個記錄和描述的UXSS,Adobe外掛通過一系列引數允許從外部資料來源取資料進行文件表單的填充,如果沒有正確的執行,將允許跨站指令碼攻擊。 案例詳見: [Acrobat外掛中的UXSS報告]("https://blog.jeremiahgrossman.com/2007/01/what-you-need-to-know-about-uxss-in.html") #### Flash Player UXSS 漏洞 – CVE-2011-2107 一個在2011年Flash Player外掛(當時的所有版本)中的缺陷使得攻擊者通過使用構造的.swf檔案,可以訪問Gmail設定和新增轉發地址。因此攻擊者可以收到任意一個被攻破的Gmail帳號的所有郵件副本(傳送的時候都會抄送份)。Adobe承認了該漏洞. 案例詳見: [Flash Player UXSS 漏洞 – CVE-2011-2107報告]("http://www.adobe.com/support/security/bulletins/apsb11-13.html") 移動裝置也不例外,而且可以成為XSS攻擊的目標。Chrome安卓版存在一個漏洞,允許攻擊者將惡意程式碼注入到Chrome通過Intent物件載入的任意的web頁面。 #### 安卓版Chrome瀏覽器漏洞 案例詳見: [Issue 144813: Security: UXSS via com.android.browser.application_id Intent extra]("https://code.google.com/p/chromium/issues/detail?id=144813") ## 突變型XSS 突變型XSS,也叫做mXSS或,全稱Mutation-based Cross-Site-Scripting。(mutation,突變,來自遺傳學的一個單詞,大家都知道的基因突變,gene mutation) ### 漏洞成因 然而,如果使用者所提供的富文字內容通過javascript程式碼進入innerHTML屬性後,一些意外的變化會使得這個認定不再成立:瀏覽器的渲染引擎會將本來沒有任何危害的HTML程式碼渲染成具有潛在危險的XSS攻擊程式碼。 隨後,該段攻擊程式碼,可能會被JS程式碼中的其它一些流程輸出到DOM中或是其它方式被再次渲染,從而導致XSS的執行。 這種由於HTML內容進入innerHTML後發生意外變化,而最終導致XSS的攻擊流程。 ### 攻擊流程 ​ 將拼接的內容置於innerHTML這種操作,在現在的WEB應用程式碼中十分常見,常見的WEB應用中很多都使用了innerHTML屬性,這將會導致潛在的mXSS攻擊。從瀏覽器角度來講,mXSS對三大主流瀏覽器(IE,CHROME,FIREFOX)均有影響。 #### mXSS種類 目前為止已知的mXSS種類,接下來的部分將分別對這幾類進行討論與說明。 + 反引號打破屬性邊界導致的 mXSS;(該型別是最早被發現並利用的一類mXSS,於2007年被提出,隨後被有效的修復) + 未知元素中的xmlns屬性所導致的mXSS;(一些瀏覽器不支援HTML5的標記,例如IE8,會將article,aside,menu等當作是未知的HTML標籤。) + CSS中反斜線轉義導致的mXSS;(在CSS中,允許用\來對字元進行轉義,例如:`property: 'v\61 lue'` 表示 `property:'value'`,其中61是字母a的ascii碼(16進位制)。\後也可以接unicode,例如:\20AC 表示 € 。正常情況下,這種轉義不會有問題。但是碰上innerHTML後,一些奇妙的事情就會發生。) + CSS中雙引號實體或轉義導致的mXSS;(接著上一部分,依然是CSS中所存在的問題,`"` `"` `"` 等雙引號的表示形式均可導致這類問題,) + CSS屬性名中的轉義所導致的mXSS; + 非HTML文件中的實體突變; + HTML文件中的非HTML上下文的實體突變; # 三、XSS攻擊程式碼出現的場景 + **普通的XSS JavaScript注入**,示例如下: ``` ``` + **IMG標籤XSS使用JavaScript命令**,示例如下: ``` ``` + **IMG標籤無分號無引號**,示例如下: ``` ``` + **IMG標籤大小寫不敏感**,示例如下: ``` ``` + **HTML編碼(必須有分號)**,示例如下: ``` ``` + **修正缺陷IMG標籤**,示例如下: ``` ”> ``` + **formCharCode標籤**,示例如下: ``` ``` + **UTF-8的Unicode編碼**,示例如下: ``` ``` + **7位的UTF-8的Unicode編碼是沒有分號的**,示例如下: ``` ``` + **十六進位制編碼也是沒有分號**,示例如下: ``` ``` + **嵌入式標籤,將Javascript分開**,示例如下: ``` ``` + **嵌入式編碼標籤,將Javascript分開**,示例如下: ``` ``` + **嵌入式換行符**,示例如下: ``` ``` + **嵌入式回車**,示例如下: ``` ``` + **嵌入式多行注入JavaScript,這是XSS極端的例子**,示例如下: ``` ``` + **解決限制字元(要求同頁面)**,示例如下: ```javascript ``` + **空字元**,示例如下: ``` perl -e ‘print “ ”;’ > out ``` + **空字元2,空字元在國內基本沒效果.因為沒有地方可以利用**,示例如下: ``` perl -e ‘print “alert(\”XSS\”)
”;’ > out ``` + **Spaces和meta前的IMG標籤**,示例如下: ``` ``` + **Non-alpha-non-digit XSS**,示例如下: ``` ``` + **Non-alpha-non-digit XSS to 2**,示例如下: ``` ``` + **Non-alpha-non-digit XSS to 3**,示例如下: ``` ``` + **雙開括號**,示例如下: ``` < ``` + **無結束指令碼標記(僅火狐等瀏覽器)**,示例如下: ``` ``` + **換碼過濾的JavaScript**,示例如下: ``` \”;alert(‘XSS’);// ``` + **結束Title標籤**,示例如下: ``` ``` + **Input Image**,示例如下: ``` ``` + **BODY Image**,示例如下: ``` ``` + **BODY標籤**,示例如下: ``` ``` + **IMG Dynsrc**,示例如下: ``` ``` + **IMG Lowsrc**,示例如下: ``` ``` + **BGSOUND**,示例如下: ``` ``` + **STYLE sheet**,示例如下: ``` ``` + **遠端樣式表**,示例如下: ```
``` + **List-style-image(列表式)**,示例如下: ```
  • XSS ``` + **IMG VBscript**,示例如下: ```
    • XSS ``` + **META連結url**,示例如下: ``` ``` + **Iframe**,示例如下: ```