RSS訂閱

2012年4月26日 星期四

IIS 7要求篩選規則

IIS7要求篩選(Request Filtering)功能可以針對整部伺服器,特定網站或網頁應用程式設定一群規則以便決定那些類型的請求將被允許,那些類型的請求將被予以拒絕。

IIS7這項功能類似於先前IIS6版本的URLScan功能,並且再加以延伸擴充使其篩選規則上更具彈性,而主要的改進與加強為:

       IIS7 的要求篩選功能被實作為模組,而非先前的ISAPI篩選器。

       IIS7 的要求篩選功能可以針對特定的網站或網頁應用程式,而非像以往只能針對整部伺服器。

       IIS7 的要求篩選功能整合IIS的記錄檔,而URLScan則維護自己的記錄檔。

       IIS7 的要求篩選功能允許特定名稱空間(URLs)的請求被完全拒絕。

IIS7的要求篩選和URLScan的安全性功能的重要性在於它可以用來做為簡易低成本的網頁應用程式防火牆(Web Application FirewallWAF),以便建立適當的篩選規則,可以一些針對網頁應用程式撰寫不當或網站本身的弱點進行攔阻。


設定請求篩選功能

設定IIS7 的請求篩選功能有下列三種方式:

1.       編輯組態檔applicationHost.configWeb.config內的<requestFiltering>設定段。

2.       使用appcmd命令

3.       安裝Administration Pack for IIS 7.0以便可以使用IIS管理員的檢視功能加以設定 (Windows Server 2008 R2的IIS 7.5版已為內建,只要在安裝IIS角色時,核選安全性底下的「要求篩選」服務即可)

強烈建議安裝Administration Pack for IIS 7.0,以便可以使用IIS管理員以圖形介面的方式直接建立各種篩選規則,因為一旦您安裝了Administration Pack for IIS 7.0後,就可以在IIS管理員內的伺服器、特定網站或目錄的中間功能檢視窗格內看到一個名稱為【Request Filtering】功能圖示(如下圖),只要按二下就可以啟動Request Filtering的功能檢視設定畫面,您可以由畫面上看到IIS7提供了五種主要要求篩選方式:

       副檔名(Filtering by File Extension)

       隱藏區段(Hidden Segments)

       URL

       HTTP指令動詞(HTTP Verbs)

       標頭 (Headers)

iis7_request_filter1

 


利用副檔名篩選

此種方法乃是利用檔案延伸名稱為依據來進行請求篩選,您可以先設定對於那些未列於File Name Extensions索引標籤內的檔案延伸名稱預設規則為允許或拒絶(Deny by default or Allow by Default),然後再新增適當的允許或拒絶的規則,由於預設上為採用允許規則,所以您通常只要新增拒絶規則來對特定的檔案類型請求加以阻止,作法乃是在Request Filtering的功能檢視的File Name Extensions索引標籤畫面中,按一下右側動作窗格的Deny File Name Extension】選項來啟動【Deny File Name Extension】設定對話盒,然後輸入延伸名稱,再按【確定】按鈕即可。

iis7_request_filter2

假若您需要改採用預設上拒絶所有未在清單的延伸檔名時,您需要按一下右側動作窗格的【Edit feature settings】選項來啟動【Edit feature settings】設定對話盒,並清除最上頭的核選方塊 Allow unlisted file name extensions】即可,爾後所有檔案均會被拒絶,除非您利用【Allow File Name Extension】選項來啟動【Allow File Name Extension】對話方塊來新增允許請求的延伸名稱。

iis7_request_filter3

一旦完成設定,將會在applicationHost.config或是Web.config檔內加入下列XML標籤:

 

<security>

            <requestFiltering>

                <fileExtensions>

                    <add fileExtension=".asax" allowed="false" />

                    <add fileExtension=".ascx" allowed="false" />

                    <add fileExtension=".cs" allowed="false" />

                    …………..

                </fileExtensions>

            </requestFiltering>

        </security>

 


利用URL序列(URLSequences)篩選

URL序列篩選功能(denyURLSequences)讓您可以將URL請求列內包含特定子字串的請求加以拒絕,例如拒絕序列 ".." 將可以避免一個目錄瀏覽的攻擊。作法乃是在Request Filtering的功能檢視的【Deny URL Sequences】索引標籤畫面中,按一下右側動作窗格的【Add URL Sequence】選項來啟動【Add Deny Sequence】設定對話盒,然後輸入所欲篩選的字串(本例為二點),再按【確定】按鈕即可。

URL序列篩選方法無法設定預設的規則為允許或拒絕,所以您只能新增要拒絕的字串。

iis7_request_filter4

完成上述設定後,將會在applicationHost.configWeb.config檔內加入下列XML標籤:

 

        <security>

            <requestFiltering>

                <denyUrlSequences>

                    <add sequence=".." />

                </denyUrlSequences>

            </requestFiltering>

        </security>

 


利用隱藏段(Hidden Segments)篩選

 

隱藏段(hiddenSegment)可以讓管理員拒絶某些URL段(URL segment)的請求,所謂URL段指的是URL網址列內介於二個正斜線符號(/)間的字元。

例如下面二個URL列:

www.example.com/products/clock

www.example.com/products/clocklink

假若您希望用戶端可以請求第二個網址(clocklink),而拒絶第一個網址請求(clock),則您使用上述介紹的URL序列(denyURLSequences)並沒有幫助,因為新增clock此序列後,將會同時阻擋了這二個請求的目錄,這時就需要使用隱藏段(hiddenSegment)的篩選功能,因為新增clock段後將可以拒絶第一個網址請求(clock),但允許第一個請求(clocklink),作法乃是在Request Filtering的功能檢視的【Hidden segments】索引標籤畫面中,按一下右側動作窗格的【Add Hidden Segment】選項來啟動【Add Hidden Segment】設定對話盒,然後輸入所欲篩選的URL段字元(本例為clock),再按【確定】按鈕即可。

iis7_request_filter5

此設定將會在applicationHost.configWeb.config檔內加入下列XML標籤:

        <security>

            <requestFiltering>

                <hiddenSegments>

                    <add segment="clock" />

                </hiddenSegments>

            </requestFiltering>

        </security>


利用HTTP verbs 篩選

HTTP verbs篩選功能可以讓管理員允許或拒絕特定的HTTP方法(GET、POST、HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS),與上述的副檔案名稱篩選功能一般,您可以使用預設所有HTTP方法均加以拒絕的正面列表方式,或者採用預設所有HTTP方法均允許的負面列表的設定方式(預設方法),這項功能相當於先前URLScan的[allowVerbs] 和 [denyVerbs] 設定段功能。

例如基於安全性理由決定採用預設拒絶所有HTTP方法,而只允許GET、POST、HEAD三個方法,所以作法為:

1. 啟動IIS管理員。

2. 由左側連線窗格內,按一下伺服器、特定網站或目錄。

3. 由中間的功能檢視窗格中,按二下【Request Filtering】圖示以進入【Request Filtering】設定頁。

4. 按一下【HTTP verbs】索引標籤。

5. 由右側的動作窗格中,按一下【Edit Feature Settings】連結以啟用【Edit Request Filtering Settings】對話方塊,並清除【Allow unlisted verbs】核選方塊以便將預設原則改為拒絕,按【確定】關閉對話方塊

iis7_request_filter6

 

6. 接下來,您需要從檢視功能窗格右鍵功能表內,選取【Allow Verb】選項,然後輸入想要放行的HTTP方法。

 

iis7_request_filter7

此設定將會在applicationHost.configWeb.config檔內加入下列XML標籤:

<security>

       <requestFiltering>

               <verbs allowUnlisted="false" >

                       <add verb="GET" allowed="true" />

                       <add verb="POST" allowed="true" />

                       <add verb="HEAD" allowed="true" />

               </verbs>

       </requestFiltering>

</security>


利用標頭(Header)篩選

Header 篩選功能提供管理員可以限制HTTP標頭內特定欄位的長度,如此可以降低一些潛在的緩衝區溢位的攻擊,例如下圖說明如何對HTTP標頭的Content-type欄位設定長度限制,作法及步驟如下:

1. 啟動IIS管理員。

2. 由左側連線窗格內,按一下伺服器、特定網站或目錄。

3. 由中間的功能檢視窗格中,按二下【Request Filtering】圖示以進入【Request Filtering】設定頁。

4. 按一下【Headers】索引標籤。

5. 從檢視功能窗格右鍵功能表內,或是右側動作窗格中選取【Add Header】選項。

在【Add Header】對話方塊中,輸入HTTP標頭欄位名稱和所要限制的長度,例如下圖限制Content-type欄位只允許100位元組的長度限制。

iis7_request_filter8

上述的設定將會在applicationHost.configWeb.config檔內加入下列XML標籤:

<security>

    <requestFiltering>

         <requestLimits>

             <headerLimits>

                  <add header="Content-type" sizeLimit="100" />

             </headerLimits>

         </requestLimits>

    </requestFiltering>

</security>


過濾雙重編碼(Double-encoded)請求

有些網站的攻擊可以將URL請求利用二次編碼技術以便通過安全性控制或引起非預期的應用程式行為(例如將“../” 雙重編碼成為 "%252E%252E%252F"),所以建議將URL請求內的雙重編碼(Double-encoded)請求加以過濾。

過濾掉雙重編碼(Double-encoded)的請求,您需要在【Request Filtering】設定頁中,開啟【Edit Request Filtering Settings】對話方塊,並確認【Allow double escaping】核選方塊為清除未選取的狀況(預設即為清除狀況),一旦設定不允許雙重編碼,則IIS 7將會將URL請求加以還原其原字元的正常化(Normalize)處理二次,如果第一次與第二次並不相同,即加以拒絕。

iis7_request_filter9

上述的設定將會在applicationHost.configWeb.config檔內加入如下的XML標籤(預設即為false)

<security>

            <requestFiltering allowDoubleEscaping="false">

  ........................................


過濾SQL Injection的攻擊

SQL Injection是近年來最常見的資料庫攻擊手法,駭客利用SQL 敘述可以串連的特性,串接惡意的SQL敘述來執行新增、修改記錄的內容或是刪除資料表格的攻擊動作,對於SQL Injection的攻擊因應方法,最重要的是程式員必需作好所有資料輸入的型態檢查、長度檢查並設計正確的查詢方法之外,IIS的管理員還可以針對特定的SQL關鍵詞或關鍵符號來加以篩選,做法為:

1.        開啟並編輯下列檔案:

%systemroot%\system32\inetsrv\config\applicationhost.config

2.        搜尋"<requestFiltering>" 標籤,並緊接在其下方貼上下列的一段篩選內容:

<filteringRules>

    <filteringRule name="SQLInjection" scanQueryString="true">

        <appliesTo>

            <add fileExtension=".asp" />

            <add fileExtension=".aspx" />

        </appliesTo>

        <denyStrings>

            <add string="--" />

            <add string=";" />

            <add string="/*" />

            <add string="@" />

            <add string="char" />

            <add string="alter" />

            <add string="begin" />

            <add string="cast" />

            <add string="create" />

            <add string="cursor" />

            <add string="declare" />

            <add string="delete" />

            <add string="drop" />

            <add string="end" />

            <add string="exec" />

            <add string="fetch" />

            <add string="insert" />

            <add string="kill" />

            <add string="open" />

            <add string="select" />

            <add string="sys" />

            <add string="table" />

            <add string="update" />

        </denyStrings>

    </filteringRule>

</filteringRules>

 

然後儲存此檔即可,以後IIS會對所有連入的asp或aspx檔案請求,搜尋請求的查詢字串內是否存在如上面所定義的字串,一旦發現將封鎖這個請求並回應404的錯誤。,

讀者回響 (aohongchen@yahoo.com)