前端安全之XSS攻擊

技術小美發表於2017-11-12

XSS(cross-site scripting跨域指令碼攻擊)攻擊是最常見的Web攻擊,其重點是“跨域”和“客戶端執行”。有人將XSS攻擊分為三種,分別是:

1. Reflected XSS(基於反射的XSS攻擊)

2. Stored XSS(基於儲存的XSS攻擊)

3. DOM-based or local XSS(基於DOM或本地的XSS攻擊)

Reflected XSS

基於反射的XSS攻擊,主要依靠站點服務端返回指令碼,在客戶端觸發執行從而發起Web攻擊。

例子:

1. 做個假設,當亞馬遜在搜尋書籍,搜不到書的時候顯示提交的名稱。

2. 在搜尋框搜尋內容,填入“// ”, 點選搜尋。

3. 當前端頁面沒有對返回的資料進行過濾,直接顯示在頁面上, 這時就會alert那個字串出來。

4. 進而可以構造獲取使用者cookies的地址,通過QQ群或者垃圾郵件,來讓其他人點選這個地址:

PS:這個地址當然是沒效的,只是舉例子而已。

結論:

如果只是1、2、3步做成功,那也只是自己折騰自己而已,如果第4步能做成功,才是個像樣的XSS攻擊。

開發安全措施:

1. 前端在顯示服務端資料時候,不僅是標籤內容需要過濾、轉義,就連屬性值也都可能需要。

2. 後端接收請求時,驗證請求是否為攻擊請求,攻擊則遮蔽。

例如:

標籤:

轉義

屬性:

如果一個input的value屬性值是

就可能出現

點選input導致攻擊指令碼被執行,解決方式可以對script或者雙引號進行過濾。

Stored XSS

基於儲存的XSS攻擊,是通過發表帶有惡意跨域指令碼的帖子/文章,從而把惡意指令碼儲存在伺服器,每個訪問該帖子/文章的人就會觸發執行。

例子:

1. 發一篇文章,裡面包含了惡意指令碼

2. 後端沒有對文章進行過濾,直接儲存文章內容到資料庫。

3. 當其他看這篇文章的時候,包含的惡意指令碼就會執行。

PS:因為大部分文章是儲存整個HTML內容的,前端顯示時候也不做過濾,就極可能出現這種情況。

結論:

後端儘可能對提交資料做過濾,在場景需求而不過濾的情況下,前端就需要做些處理了。

開發安全措施:

1. 首要是服務端要進行過濾,因為前端的校驗可以被繞過。

2. 當服務端不校驗時候,前端要以各種方式過濾裡面可能的惡意指令碼,例如script標籤,將特殊字元轉換成HTML編碼。

DOM-based or local XSS

基於DOM或本地的XSS攻擊。一般是提供一個免費的wifi,但是提供免費wifi的閘道器會往你訪問的任何頁面插入一段指令碼或者是直接返回一個釣魚頁面,從而植入惡意指令碼。這種直接存在於頁面,無須經過伺服器返回就是基於本地的XSS攻擊。

例子1:

1. 提供一個免費的wifi。

1. 開啟一個特殊的DNS服務,將所有域名都解析到我們的電腦上,並把Wifi的DHCP-DNS設定為我們的電腦IP。

2. 之後連上wifi的使用者開啟任何網站,請求都將被我們擷取到。我們根據http頭中的host欄位來轉發到真正伺服器上。

3. 收到伺服器返回的資料之後,我們就可以實現網頁尾本的注入,並返回給使用者。

4. 當注入的指令碼被執行,使用者的瀏覽器將依次預載入各大網站的常用指令碼庫。

PS:例子和圖片來自,http://www.cnblogs.com/index-html/p/wifi_hijack_3.html 不是我寫的,請注意!

這個其實就是wifi流量劫持,中間人可以看到使用者的每一個請求,可以在頁面嵌入惡意程式碼,使用惡意程式碼獲取使用者的資訊,可以返回釣魚頁面。

例子2:

1. 還是提供一個免費wifi

2. 在我們電腦上進行抓包

3. 分析資料,可以獲取使用者的微信朋友圈、郵箱、社交網站帳號資料(HTTP)等。

PS:這個是我的測試,在51job頁面登入時進行抓包,可以獲取帳號密碼。

結論:

這攻擊其實跟網站本身沒有什麼關係,只是資料被中間人獲取了而已,而由於HTTP是明文傳輸的,所以是極可能被竊取的。

開發安全措施:

1. 使用HTTPS!就跟我前面《HTTP與HTTPS握手的那些事》這篇文章說的,HTTPS會在請求資料之前進行一次握手,使得客戶端與服務端都有一個私鑰,服務端用這個私鑰加密,客戶端用這個私鑰解密,這樣即使資料被人擷取了,也是加密後的資料。

總結

XSS攻擊的特點就是:盡一切辦法在目標網站上執行非目標網站上原有的指令碼(某篇文章說的)。本地的XSS攻擊的示例2其實不算XSS攻擊,只是簡單流量劫持。前兩種XSS攻擊是我們開發時候要注意的,而流量劫持的則可以使用HTTPS提高安全性,。

相關文章