使用要求篩選
由 IIS 小組
簡介
UrlScan 是安全性工具,提供為舊版 Internet Information Services (IIS) 的附加元件,因此系統管理員可以在其 Web 服務器上強制執行更嚴格的安全性原則。 在 IIS 7 和更新版本中,URLScan 的所有核心功能都已併入名為要求篩選的模組,並已新增隱藏區段功能。 本文說明要求篩選的每個功能,並提供如何在環境中套用功能的範例。
請注意,IIS 也包含用於 URL 重寫的模組。 這兩個模組之間有差異:要求篩選是針對安全性案例所設計和優化,而 URL 重寫可以套用到一組廣泛的案例, (安全性案例只是這些) 的子集。 如需差異的詳細資訊,請參閱 IIS 7.0 和更新版本要求篩選和 URL 重寫。
篩選Double-Encoded要求
這項功能可防止依賴雙編碼要求的攻擊,如果攻擊者向 IIS 提交經過仔細製作雙編碼的要求,就會套用此攻擊。 啟用雙編碼要求篩選時,IIS 會將 URL 正規化兩次;如果第一個正規化與第二個不同,則會拒絕要求,而記錄的錯誤碼為 404.11。 雙重編碼的要求篩選準則是 UrlScan 中的 VerifyNormalization 選項。
如果您不想讓 IIS 允許提供雙編碼要求,請使用下列專案:
<configuration>
<system.webServer>
<security>
<requestFiltering
allowDoubleEscaping="false">
</requestFiltering>
</security>
</system.webServer>
</configuration>
篩選高位字元
此功能允許或拒絕包含非 ASCII 字元的 IIS 的所有要求,並記錄錯誤碼 404.12。 UrlScan 對等專案是 AllowHighBitCharacters。
例如,假設您想要允許一個應用程式的高位字元,但不適用於整個伺服器。 在ApplicationHost.config檔案中設定 allowHighBitCharacters=「false」;但在應用程式根目錄中,建立Web.config檔案,讓單一應用程式接受非 ASCII 字元。 在Web.config檔案中,使用:
<configuration>
<system.webServer>
<security>
<requestFiltering
allowHighBitCharacters="true"
>
</requestFiltering>
</security>
</system.webServer>
</configuration>
根據副檔名篩選
這項功能會定義 IIS 提供一組允許的副檔名。 當 IIS 根據副檔名拒絕要求時,記錄的錯誤碼為 404.7。 AllowExtensions 和 DenyExtensions 選項是 UrlScan 對等專案。
例如,假設您想要允許 ASP 檔案以外的每種檔案類型。 將 fileExtensions 的 allowUnlisted 選項設定為 「true」,然後定義副檔名專案以明確拒絕 ASP:
<configuration>
<system.webServer>
<security>
<requestFiltering>
<fileExtensions allowUnlisted="true" >
<add fileExtension=".asp" allowed="false"/>
</fileExtensions>
</requestFiltering>
</security>
</system.webServer>
</configuration>
根據要求限制篩選
此篩選會結合在 UrlScan) 中具有相同名稱的三個功能 (:
- maxAllowedContentLength–內容大小的上限
- url 長度的 maxUrl-上限
- maxQueryString-上限,其長度為查詢字串
當 IIS 根據要求限制拒絕要求時,記錄的錯誤碼為:
- 如果內容太長,則為 413.1。
- 如果 URL 太大,則為 404.14。
- 如果查詢字串太長,則為 404.15。
例如,公司通常會購買沒有原始程式碼存取權的軟體。 經過一段時間後,他們可能會在該程式碼中發現弱點。 取得受影響程式碼的更新通常不容易。 問題通常是因為 URL 或查詢字串太長,或超過傳送至應用程式的內容所造成。 決定安全上限之後,您可以使用下列組態來套用限制,而不需要修補應用程式二進位檔:
<configuration>
<system.webServer>
<security>
<requestFiltering>
<requestLimits
maxAllowedContentLength="30000000"
maxUrl="260"
maxQueryString="25"
/>
</requestFiltering>
</security>
</system.webServer>
</configuration>
依動詞篩選
這項功能會定義 IIS 接受做為要求一部分的動詞清單。 當 IIS 根據這項功能拒絕要求時,記錄的錯誤碼為 404.6。 這對應于 UrlScan 中的 UseAllowVerbs、AllowVerbs 和 DenyVerbs 選項。
例如,假設您只想要只允許動詞 GET。 若要設定此設定,您必須先鎖定組態,以允許允許任何動詞,方法是設定 allowUnlisted=「false」 選項。 接下來,列出您想要明確允許的動詞,在此案例中為 GET。
<configuration>
<system.webServer>
<security>
<requestFiltering>
<verbs
allowUnlisted="false"
>
<add verb="GET" allowed="true" />
</verbs>
</requestFiltering>
</security>
</system.webServer>
</configuration>
根據 URL 序列篩選
這項功能會定義 IIS 在要求屬於要求時拒絕的序列清單。 當 IIS 拒絕此功能的要求時,記錄的錯誤碼為 404.5。這對應于 UrlScan 中的 DenyUrlSequences 功能。
這是非常強大的功能。 使用下列程式碼,您可以防止 IIS 提供指定的字元序列:
<configuration>
<system.webServer>
<security>
<requestFiltering>
<denyUrlSequences>
<add sequence=".."/>
</denyUrlSequences>
</requestFiltering>
</security>
</system.webServer>
</configuration>
在上一個範例中, '..' 序列遭到拒絕。 假設您從出家的廠商購買應用程式,併發現當指定的字元序列傳送給應用程式時,應用程式容易遭受攻擊。 使用這項功能,只要將該 URL 序列新增至拒絕清單即可保護該應用程式,而不需要修補應用程式的程式碼。
篩選掉隱藏區段
這項功能可讓您定義哪些區段為「可服務」。當 IIS 根據這項功能拒絕要求時,記錄的錯誤碼為 404.8。 這項功能是 IIS 7 和更新版本新功能;它不是 UrlScan 的一部分。
請考慮下列範例,其中伺服器上有兩個 URL:
http://site.com/bin
http://site.com/binary
假設您想要允許二進位目錄中的內容,但不要允許 bin 目錄中的內容。 如果您使用 URL 序列並拒絕序列 「bin」,您會拒絕這兩個 URL 的存取權。 使用如下所示的組態,您可以拒絕 bin 的存取權,但仍提供二進位檔中的內容:
<configuration>
<system.webServer>
<security>
<requestFiltering>
<hiddenSegments>
<add segment="BIN"/>
</hiddenSegments>
</requestFiltering>
</security>
</system.webServer>
</configuration>
IIS 7 和更新版本錯誤碼
在舊版中,您可以使用全域層級的 UrlScan 來定義您想要在系統上強制執行的安全性原則。 使用 IIS 7 和更新版本,您仍然可以在全域層級實作這些原則,但也可以依 URL 實作這些原則。 因此,您可以利用新豐富委派模型提供的所有優點。
下表是錯誤碼 IIS 記錄的摘要:
錯誤 | 狀態碼 |
---|---|
找不到網站 | 404.1 |
原則拒絕 | 404.2 |
mime map 拒絕 | 404.3 |
沒有處理常式 | 404.4 |
要求篩選:URL 序列遭拒 | 404.5 |
要求篩選:動詞拒絕 | 404.6 |
要求篩選:副檔名遭拒 | 404.7 |
要求篩選:隱藏區段拒絕 | 404.8 |
因為已設定隱藏的檔案屬性,所以拒絕 | 404.9 |
要求篩選:拒絕,因為 URL 重複逸出 | 404.11 |
要求篩選:因為高位字元而遭到拒絕 | 404.12 |
要求篩選:因為 URL 太長而遭到拒絕 | 404.14 |
要求篩選:拒絕,因為查詢字串太長 | 404.15 |
要求篩選:拒絕,因為內容長度太大 | 413.1 |
要求篩選:拒絕,因為要求標頭太長 | 431 |