Web 安全之 XSS

發表於2018-05-25

什麼是XSS

跨站指令碼攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站指令碼攻擊縮寫為XSS。惡意攻擊者往Web頁面裡插入惡意Script程式碼,當使用者瀏覽該頁之時,嵌入其中Web裡面的Script程式碼會被執行,從而達到惡意攻擊使用者的目的。

XSS的攻擊場景

  • 反射型

    這類攻擊方式主要藉助URL來實施。URL的構成分為協議、域名、埠、路徑、查詢幾部分構成。如圖所示:

image

  • XSS往往在“查詢”部分發現漏洞構造攻擊程式碼實施攻擊,所謂“反射”可以理解為hacker並不會直接攻擊客戶,而是通過URL植入程式碼通過伺服器獲取並植入到使用者頁面完成攻擊。攻擊流程圖如下:

image

  • 儲存型

    儲存型攻擊方式和反射型最大的區別就是不通過URL來傳播,而是利用站點本身合法的儲存結構,比如評論。任何使用者都可以通過站點提供的介面提交評論內容,這些評論內容都被儲存到伺服器的資料庫。當使用者訪問這些評論的時候,伺服器從資料庫提取內容插入到頁面反饋給使用者。如果評論內容本身是具備攻擊性內容,使用者無一倖免。攻擊流程圖如下:

image

  • 從上下兩個流程圖來看,反射型和儲存型的攻擊方式是本質不同的,前者需要藉助各種社交渠道傳播具備攻擊的URL來實施,後者通過網站本身的儲存漏洞,攻擊成本低很多,而且傷害力更大。

XSS的工作原理

不管是反射型還是儲存型,服務端都會將JavaScript當做文字處理,這些文字在服務端被整合進html文件中,在瀏覽器解析這些文字的過程也就是XSS被執行的時候。

從攻擊到執行分為以下幾步:

  1. 構造攻擊程式碼
  2. 服務端提取並寫入HTML
  3. 瀏覽器解析,XSS執行
構造攻擊程式碼

hacker在發現站點對應的漏洞之後,基本可以確定是使用“反射型”或者“儲存型”。對於反射型這個很簡單了,執行類似程式碼:

image

大家知道很多站點都提供搜尋服務,這裡的item欄位就是給服務端提供關鍵詞。如果hacker將關鍵詞修改成可執行的JavaScript語句,如果服務端不加處理直接將類似程式碼回顯到頁面,XSS程式碼就會被執行。

這段程式碼的含義是告訴瀏覽器載入一張圖片,圖片的地址是空,根據載入機制空圖片的載入會觸發Element的onerror事件,這段程式碼的onerror事件是將本地cookie傳到指定的網站。

很明顯,hacker可以拿到“中招”使用者的cookie,利用這個身份就可以拿到很多隱私資訊和做一些不當的行為了。

對於儲存型直接通過讀取資料庫將內容打到介面上就可以了。

服務端提取並寫入HTML

我們以 Node.js 應用型框架express.js為例:

服務端程式碼(express.js)

image

ejs模板

image

這裡列舉了以反射型為主的服務端程式碼,通過獲取URL的查詢res.query.item,最後在模板中輸出內容。對於儲存型的區別是通過資料庫拿到對應內容,模板部分一致。

瀏覽器解析,XSS執行

image

從這個圖上來看瀏覽器解析主要做三件事:

  • 將文件解析成DOM Tree
  • 解析CSS成規則樹
  • Javascript解析

在這個過程,XSS的程式碼從文字變的可執行。

XSS的防範措施

編碼

對於反射型的程式碼,服務端程式碼要對查詢進行編碼,主要目的就是將查詢文字化,避免在瀏覽器解析階段轉換成DOM和CSS規則及JavaScript解析。

常見的HTML實體編碼如下:

image

除了編碼和解碼,還需要做額外的共奏來解決富文字內容的XSS攻擊。

我們知道很多場景是允許使用者輸入富文字,而且也需要將富文字還原。這個時候就是hacker容易利用的點進行XSS攻擊。

DOM Parse和過濾

從XSS工作的原理可知,在服務端進行編碼,在模板解碼這個過程對於富文字的內容來說,完全可以被瀏覽器解析到並執行,進而給了XSS執行的可乘之機。

為了杜絕悲劇發生,我們需要在瀏覽器解析之後進行解碼,得到的文字進行DOM parse拿到DOM Tree,對所有的不安全因素進行過濾,最後將內容交給瀏覽器,達到避免XSS感染的效果。

具體原理如下:

image

  • 解碼

image

  • DOM Parse和過濾

image

在此展示了部分程式碼,其中DOM Parse可以採用第三方的Js庫來完成。

XSS的危害

相信大家都對XSS了有一定的瞭解,下面列舉幾個XSS影響比較大的事件供參考,做到警鐘長鳴。

  • 微博遭受攻擊案例

    2011年6月28日晚,新浪微博遭遇到XSS蠕蟲攻擊侵襲,在不到一個小時的時間,超過3萬微博使用者受到該XSS蠕蟲的攻擊。此事件給嚴重依賴社交網路的網友們敲響了警鐘。在此之前,國內多家著名的SNS網站和大型部落格網站都曾遭遇過類似的攻擊事件,只不過沒有形成如此大規模傳播。雖然此次XSS蠕蟲攻擊事 件中,惡意黑客攻擊者並沒有在惡意指令碼中植入掛馬程式碼或其他竊取使用者賬號密碼資訊的指令碼,但是這至少說明,病毒木馬等黑色產業已經將眼光投放到這個尚存漏洞的領域。

  • 貓撲遭受攻擊案例

    曾經在貓撲大雜燴中存在這樣一個XSS漏洞,在使用者發表回覆的時候,程式對使用者發表的內容做了嚴格的過濾,但是我不知道為什麼,當使用者編輯回覆內容再次發表的時候,他卻採用了另外一種不同的過濾方式,而這種過濾方式顯然是不嚴密的,因此導致了XSS漏洞的出現。試想一下,像貓撲這樣的大型社群,如果在一篇熱帖中,利用XSS漏洞來使所有的瀏覽這篇帖子的使用者都在不知不覺之中訪問到了另外一個站點,如果這個站點同樣是大型站點還好,但如果是中小型站點那就悲劇了,這將會引來多大的流量啊!更可怕的是,這些流量全部都是真實有效的!

如果本文有描述不準確或錯誤,歡迎大家指正……,不勝感激。

相關文章