The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

推薦使用 Microsoft Anti-Cross Site Scripting Library V3.0

微軟最近推出了 Microsoft Anti-Cross Site Scripting Library V3.0 正式版(RTM),但在國內似乎沒看到許多人提到這套函示庫,就我來觀察有幾點可能的原因:

從 Wikipedia 上的 Cross-site scripting (XSS) 提到 XSS 有三種類型:

  • 非固定式 XSS 攻擊 (Non-persistent)
    1. 這是最常見的攻擊類型,日前好幾次大規模 XSS 攻擊事件都是此類攻擊。
    2. 沒經驗的開發人員最容易遭受此類型的 XSS 攻擊。
    3. 像 Request, Request.Form, Request.QueryString, Request.Cookie, Request.Headers 等等都是常見的攻擊來源。
  • 固定式 XSS 攻擊 (Persistent)
    • 又稱 Stored-XSS 攻擊。
    • 駭客會試圖將「攻擊 XSS 字串」透過各種管道寫入到目標網站的資料庫中,讓瀏覽網站的使用者下載病毒、執行特定指令碼、當成 DDoS 的跳板、…等等。
  • 以 DOM 為基礎的 XSS 攻擊 (DOM-based)
    • 此類型會利用網頁透過 JavaScript 動態顯示資訊到頁面中(透過 DOM 修改內容),但內容並未透過 HtmlEncode 過,導致遭駭客傳入惡意指令碼(JavaScript或VBScript)並讓使用者遭殃,或試圖修改原有網頁中的資訊用以欺騙使用者執行特定動作或進行資訊詐騙。
    • 另一種是透過 Browser 的漏洞將 JavaScript 先寫入本機電腦,然後在透過被 XSS 攻擊過的網頁載入本機 JavaScript 檔案進行本機電腦的攻擊,例如植入病毒或木馬之類的程式。

我們都知道在 ASP.NET 中預設都會阻擋可能會導致 XSS 攻擊的字串,例如 < 或 > 符號。相關資訊可參考:How To: Prevent Cross-Site Scripting in ASP.NETRequest Validation - Preventing Script Attacks,建議每位開發人員都應該閱讀這幾篇文章。

不過若因為專案所需,例如「網站後台」為了內容管理的需求可能就會將這項基本防護功能關閉,這時就有可能會讓你的資料庫被污染,以導致被攻擊的 HTML/Scripting 被輸出到前台網頁上。

有經驗的 ASP.NET 開發人員都知道如何撰寫阻擋 XSS 的程式碼,一個最簡單的也最常見的防護方式就是在頁面輸出變數時都一律加上 HttpUtility.HtmlEncode 方法,但頁面多或開發人員多的時候可就不見得頁面每一個地方都能記得加上,除非你有錢購買靜態程式碼分析軟體定期分析你的 ASP.NET 專案。

從上述得知,你能夠在 ASP.NET 專案中做出的努力都稱為:「黑名單防護策略」,也就是針對特定網頁明確寫程式阻擋 XSS 攻擊,沒寫到的地方就破功了。

而採用 Anti-XSS Library 最大的不同就在於它採用「白名單防護策略」,預設將會以最嚴格的設定預防所有潛在的 XSS 攻擊,只有特定編碼的字元、允許的特殊符號可以允許通過 HTTP 傳輸,任何在設定以外的字元或發現潛在的 XSS 攻擊行為時就會對相關字元進行編碼,例如:HtmlEncode、UrlEncode、LDAP Encode、XPath Encode、… 等。

在安裝的時候預設安裝路徑為:C:\Program Files\Microsoft Information Security\Microsoft Anti-Cross Site Scripting Library v3.0\ ,過程中提供兩個選項讓你安裝:

Microsoft Anti-Cross Site Scripting Library V3.0 -- 預設安裝路徑為:C:\Program Files\Microsoft Information Security\Microsoft Anti-Cross Site Scripting Library v3.0\

分別說明如下:

Anti-Cross Site Scripting Library

  • 這個是一個 .NET 組件,提供一個 Microsoft.Security.Application 命名空間,與一個 AntiXSS 類別,類別中有許多靜態方法方便開發人員在 ASP.NET 專案中直接套用。
  • 內建的方法包括有HtmlEncode, JavaScriptEncode, UrlEncode, VisualBasicScriptEncode, XmlAttributeEncode, XmlEncode 等,每個方法都有一些特殊方法,值得研究一下。
  • 完整的說明請參見 "C:\Program Files\Microsoft Information Security\Microsoft Anti-Cross Site Scripting Library v3.0\Help\Anti-XSS_Library_Help.chm" 說明文件。
  • 這個 Library 也適用於 ASP.NET MVC 類型的專案。

Security Runtime Engine (SRE)

  • SRE 是一個用 .NET 撰寫而成的 HTTP module,可透過 web.config 設定載入 HTTP module 並透過 antixssmodule.config 設定檔的定義(放在應用程式根目錄)即可自動保護整個 ASP.NET 網站。(備註:SRE 較不適用於 ASP.NET MVC 專案
  • 在 C:\Program Files\Microsoft Information Security\Microsoft Anti-Cross Site Scripting Library v3.0\Security Runtime Engine\ConfigGen 目錄下有提供一個 ConfigGen.exe 程式可分析 ASP.NET 發佈的預先編譯網站的 dll 組件,並依據網站內使用的 ASP.NET 控制項進行分析,將一些經常遭受 XSS 攻擊的控制項進行自動防護作業。例如針對 Page.Title 屬性、Label 控制項的 Text 屬性、CheckBox 控制項的 Text 屬性、…等等。
  • 以下是 antixssmodule.config 的設定範例:
<?xml version="1.0" encoding="utf-8"?>

  <Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  
  <!--This section lists the controls and encoding contexts supported by SRE-->
  <ControlEncodingContexts>
      <ControlEncodingContext FullClassName="System.Web.UI.WebControls.Label" PropertyName="Text" EncodingContext="Html" />
      <ControlEncodingContext FullClassName="System.Web.UI.WebControls.HyperLink" PropertyName="Text" EncodingContext="Html" />
  </ControlEncodingContexts>
  
  <!--This section can be used to configure double encoding support-->
  <DoubleEncodingFilter Enabled="True" />
  
  <!--This section can be used to configure encoding for derived controls-->
  <EncodeDerivedControls Enabled="True" />
  
  <!--This section can be used to configure color coding of the output -->
  <MarkAntiXssOutput Enabled="False" Color="Blue"/>

  <!--This section includes the configuration for suppressing SRE for the listed files and folders-->
  <Suppressions>
      <Exclude Path="/Page_1.aspx" />
      <Exclude Path="/ExcludedDirectory/Page_2.aspx" />
  </Suppressions>

</Configuration>
        

套用 Security Runtime Engine (SRE) HTTP module 會對網站執行效能帶來一些衝擊,不過衝擊並不大,基於安全考量應該可以接受。

在 "C:\Program Files\Microsoft Information Security\Microsoft Anti-Cross Site Scripting Library v3.0\Sample Application" 目錄下有個簡易的範例程式,可以讓你徹底感受這套軟體的威力,在 web.config 裡的 validateRequest 設定為 false 的情況下,也能夠讓你的網站遠離 XSS 攻擊的威脅。

ASP.NET MVC 專案建議可以使用 Anti-Cross Site Scripting Library 搭配先前介紹的 CAT.NET 進行網站安全防護與安全檢測。

相關連結