XSS跨站腳本攻擊


XSS漏洞始終是威脅用戶的一個安全隱患。攻擊者可以利用XSS漏洞來竊取包括用戶身份信息在內的各種敏感信息、修改Web頁面以欺騙用戶,甚至控制受害者瀏覽器,或者和其他漏洞結合起來形成蠕蟲攻擊,等等。總之,關於XSS漏洞的利用,只有想不到沒有做不到。

防御XSS最佳的做法就是對數據進行嚴格的輸出編碼,使得攻擊者提供的數據不再被瀏覽器認為是腳本而被誤執行。

iframe在給我們的頁面帶來更多豐富的內容和能力的同時,也帶來了不少的安全隱患。因為iframe中的內容是由第三方來提供的,默認情況下他們不受我們的控制,他們可以在iframe中運行JavaScirpt腳本、Flash插件、彈出對話框等等,這可能會破壞前端用戶體驗。

還好在HTML5中,iframe有了一個叫做sandbox的安全屬性,通過它可以對iframe的行為進行各種限制,充分實現“最小權限“原則。使用sandbox的最簡單的方式就是只在iframe元素中添加上這個關鍵詞就好,就像下面這樣:

<iframe sandbox src="..."> ... </iframe>

sandbox還忠實的實現了“Secure By Default”原則,也就是說,如果你只是添加上這個屬性而保持屬性值為空,那么瀏覽器將會對iframe實施史上最嚴厲的調控限制,基本上來講就是除了允許顯示靜態資源以外,其他什么都做不了。比如不准提交表單、不准彈窗、不准執行腳本等等,連Origin都會被強制重新分配一個唯一的值,換句話講就是iframe中的頁面訪問它自己的服務器都會被算作跨域請求。

另外,sandbox也提供了豐富的配置參數,我們可以進行較為細粒度的控制。一些典型的參數如下:

  • allow-forms:允許iframe中提交form表單
  • allow-popups:允許iframe中彈出新的窗口或者標簽頁(例如,window.open(),showModalDialog(),target=”_blank”等等)
  • allow-scripts:允許iframe中執行JavaScript
  • allow-same-origin:允許iframe中的網頁開啟同源策略
  1. 攻擊者精心構造一個誘導用戶點擊的內容,比如Web頁面小游戲
  2. 將我們的頁面放入到iframe當中
  3. 利用z-index等CSS樣式將這個iframe疊加到小游戲的垂直方向的正上方
  4. 把iframe設置為100%透明度
  5. 受害者訪問到這個頁面后,肉眼看到的是一個小游戲,如果受到誘導進行了點擊的話,實際上點擊到的卻是iframe中的我們的頁面

點擊劫持的危害在於,攻擊利用了受害者的用戶身份,在其不知情的情況下進行一些操作。如果只是迫使用戶關注某個微博賬號的話,看上去仿佛還可以承受,但是如果是刪除某個重要文件記錄,或者竊取敏感信息,那么造成的危害可就難以承受了。

有多種防御措施都可以防止頁面遭到點擊劫持攻擊,例如Frame Breaking方案。一個推薦的防御方案是,使用X-Frame-Options:DENY這個HTTP Header來明確的告知瀏覽器,不要把當前HTTP響應中的內容在HTML Frame中顯示出來。

錯誤的內容推斷

想象這樣一個攻擊場景:某網站允許用戶在評論里上傳圖片,攻擊者在上傳圖片的時候,看似提交的是個圖片文件,實則是個含有JavaScript的腳本文件。該文件逃過了文件類型校驗(這涉及到了惡意文件上傳這個常見安全問題,但是由於和前端相關度不高因此暫不詳細介紹),在服務器里存儲了下來。接下來,受害者在訪問這段評論的時候,瀏覽器會去請求這個偽裝成圖片的JavaScript腳本,而此時如果瀏覽器錯誤的推斷了這個響應的內容類型(MIME types),那么就會把這個圖片文件當做JavaScript腳本執行,於是攻擊也就成功了。

問題的關鍵就在於,后端服務器在返回的響應中設置的Content-Type Header僅僅只是給瀏覽器提供當前響應內容類型的建議,而瀏覽器有可能會自作主張的根據響應中的實際內容去推斷內容的類型。

在上面的例子中,后端通過Content-Type Header建議瀏覽器按照圖片來渲染這次的HTTP響應,但是瀏覽器發現響應中其實是JavaScript,於是就擅自做主把這段響應當做JS腳本來解釋執行,安全問題也就產生了。

如何防御

瀏覽器根據響應內容來推斷其類型,本來這是個很“智能”的功能,是瀏覽器強大的容錯能力的體現,但是卻會帶來安全風險。要避免出現這樣的安全問題,辦法就是通過設置X-Content-Type-Options這個HTTP Header明確禁止瀏覽器去推斷響應類型。

同樣是上面的攻擊場景,后端服務器返回的Content-Type建議瀏覽器按照圖片進行內容渲染,瀏覽器發現有X-Content-Type-OptionsHTTP Header的存在,並且其參數值是nosniff,因此不會再去推斷內容類型,而是強制按照圖片進行渲染,那么因為實際上這是一段JS腳本而非真實的圖片,因此這段腳本就會被瀏覽器當作是一個已經損壞或者格式不正確的圖片來處理,而不是當作JS腳本來處理,從而最終防止了安全問題的發生。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM