Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
von Suditi Lahiri
Dieser Artikel enthält eine Liste von häufigen Verwendungsszenarien für die erweiterten Funktionen zur Anforderungsfilterung, die mit Windows Server 2008 SP2 bereitgestellt werden oder unter https://www.microsoft.com/downloads/ für Windows Server 2008 RTM heruntergeladen werden können. Wenn keine entsprechende Benutzeroberfläche zum Konfigurieren dieser Features vorhanden ist, wird appcmd.exe verwendet, um die Szenarien in diesem Artikel zu behandeln und zu konfigurieren.
Erstellen von Regeln zum Verbieten von Zeichenfolgenmustern in Teilen von Anforderungen
Ein neues Feature, das der IIS-Anforderungsfilterung hinzugefügt wurde, ist die Möglichkeit, eine Regelliste zu erstellen, mit der Sie Regeln festlegen können, um Anforderungen basierend auf der Übereinstimmung von Mustern mit bestimmten Teilen einer HTTP-Anforderung zu verbieten. Die Hauptkonfiguration dafür ist der Abschnitt filteringRules unter dem Abschnitt system.webServer/security/requestFiltering. Bei einer verweigerten Bedingung wird HTTP-Fehler 404.19 ausgelöst.
Beispiel
In diesem Beispiel möchte ein Serveradministrator die Zeichenfolgen „Foo“ und „Bar“ im Header „Foo-Header“ mithilfe von appcmd.exe blockieren:
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"filteringRules.[name='BlockFooInHeader']"
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"filteringRules.[name='BlockFooInHeader'].scanHeaders.[requestHeader='Foo-Header']"
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"filteringRules.[name='BlockFooInHeader'].denyStrings.[string='Foo']"
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"filteringRules.[name='BlockFooInHeader'].denyStrings.[string='Bar']"
Konfigurationen
<configuration>
<system.webServer>
<security>
<requestFiltering>
<filteringRules>
<filteringRule name="BlockFooInHeader">
<scanHeaders>
<add requestHeader="Foo-Header" />
</scanHeaders>
<denyStrings>
<add string="Foo" />
<add string="Bar" />
</denyStrings>
</filteringRule>
</filteringRules>
</requestFiltering>
</security>
</system.webServer>
</configuration>
Die folgende Anforderung würde diese Regel nicht erfüllen, da sie einen Header namens „Foo-Header“ hat, der das „Foo“-Muster enthält.
GET /iisstart.htm HTTP/1.1\r\n
Host: localhost\r\n
Accept: */*\r\n
Foo-Header: Foo--value\r\n
\r\n
Beispiel
In diesem Beispiel möchte ein Serveradministrator die Zeichenfolgen „Insert“ und „Table“ in der Abfragezeichenfolge blockieren, die mit einer „.asp“-Seite gesendet wird:
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"filteringRules.[name='BlockSqlCommands',scanQueryString='True']"
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"filteringRules.[name='BlockSqlCommands',scanQueryString='True'].appliesTo.[fileExtension='.asp']"
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"filteringRules.[name='BlockSqlCommands',scanQueryString='True'].denyStrings.[string='Insert']"
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"filteringRules.[name='BlockSqlCommands',scanQueryString='True'].denyStrings.[string='Table']"
Konfigurationen
<configuration>
<system.webServer>
<security>
<requestFiltering>
<filteringRules>
<filteringRule name="BlockSqlCommands" scanQueryString="true">
<appliesTo>
<add fileExtension=".asp" />
</appliesTo>
<denyStrings>
<add string="Insert" />
<add string="Table" />
</denyStrings>
</filteringRule>
</filteringRules>
</requestFiltering>
</security>
</system.webServer>
</configuration>
Die folgende asp-Anforderung würde diese Regel nicht erfüllen, da sie die Zeichenfolge „Insert“ in der Abfragezeichenfolge enthält:
GET /iisstart.asp?Query=InsertData HTTP/1.1\r\n
Host: localhost\r\n
Accept: */*\r\n
Foo-Header: Foo--value\r\n
\r\n
Es muss beachtet werden, dass der gesamte Header auf die Zeichenfolgenmuster überprüft wird, die im Abschnitt „denyString“ aufgeführt sind, und nicht nur der Headerwert.
Erstellen einer sicheren Liste für URLs und Abfragezeichenfolgen
Mit dieser neuen Funktion können Sie sichere URLs und Abfragezeichenfolgen angeben, die alle definierten Verweigerungsregeln umgehen. Diese Funktion muss mit Vorsicht verwendet werden, da eine falsche Konfiguration in diesem Abschnitt dazu führen kann, dass böswilligen Anforderungen Ihre Verweigerungsregeln umgehen können. Wenn ein Benutzer beispielsweise die URL „/my.login.page.asp“ immer zulassen möchte, obwohl sie eine definierte Verweigerungsregel auslösen könnte, können Sie eine Konfiguration wie unten hinzufügen, um dies zuzulassen. Die Funktion kann mit alwaysAllowedUrls und alwaysAllowedQueryStrings unter system.webServer/security/requestFiltering konfiguriert werden.
Beispiel
Im folgenden Beispiel wird appcmd.exe verwendet, um die Seite „Login.asp“ als genehmigte URL und „Allow=true“ als genehmigte Abfragezeichenfolgen-Sequenz zu konfigurieren.
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"alwaysAllowedUrls.[url='Login.asp']"
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"alwaysAllowedQueryStrings.[queryString='Allow=true']"
Konfigurationen
<configuration>
<system.webServer>
<security>
<requestFiltering>
<alwaysAllowedUrls>
<add url="Login.asp" />
</alwaysAllowedUrls>
<alwaysAllowedQueryStrings>
<add queryString="Allow=true" />
</alwaysAllowedQueryStrings>
</requestFiltering>
</security>
</system.webServer>
</configuration>
Es muss beachtet werden, dass der vorangestellte Schrägstrich „/“ erforderlich ist, damit die URL als gültige URL akzeptiert wird. Wenn ein Benutzer die Abfragezeichenfolge „session<1“ zulassen möchte, die andernfalls eine definierte Verweigerungsregel auslösen könnte, können Sie die Konfiguration wie unten hinzufügen, um dies zuzulassen. Beachten Sie, dass Sie keine Abfragezeichenfolgen angeben müssen, die mit dem Zeichen „?“ beginnen.
Erstellen einer Verweigerungsliste von URL-Sequenzen
Um eine Liste von URL-Sequenzen für alle Anforderungen zu verweigern, erstellen Sie einen denyQueryStringSequences-Abschnitt und fügen Sie die Liste der Zeichenfolgen hinzu, die Sie in der URL Ihrer Anforderungen nicht zulassen möchten. Bei der Verweigerungsliste wird nicht zwischen Groß- und Kleinschreibung unterschieden, und es sind codierte Werte im Format „%XX“ zulässig, wobei „XX“ Hexadezimalziffern sind. Bei einer verweigerten Bedingung wird HTTP-Fehler 404.18 ausgelöst.
Beispiel
Wenn Sie beispielsweise eine URL mit der Sequenz „..“ oder „./“ verweigern möchten, lautet der appcmd.exe-Befehl:
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"denyQueryStringSequences.[sequence='..']"
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"denyQueryStringSequences.[sequence='./']"
Konfigurationen
<configuration>
<system.webServer>
<security>
<requestFiltering>
<denyQueryStringSequences>
<add sequence=".." />
<add sequence="./" />
</denyQueryStringSequences>
</requestFiltering>
</security>
</system.webServer>
</configuration>
Die folgende Anforderung würde diese Regel nicht erfüllen, da sie „..“ in ihrer Abfragezeichenfolge enthält:
GET /iisstart.htm?.. HTTP/1.1\r\n
Host: localhost\r\n
Accept: */*\r\n
\r\n
Überprüfen auf Abfragezeichenfolge mit und ohne Escapezeichen
Es ist möglich, dass Sie mit dem Attribut unescapeQueryString im Abschnitt system.webServer/security/requestFiltering nach Versionen mit und ohne Escapezeichen dieses Musters suchen möchten.
Beispiel
Wenn also jemand eine Anforderung wie http://www.foo.com/id=%3C%53%43%52%49%50%54%3E
sendet, bei der die <script>-Sequenz mit Escapezeichen versehen wurde, möchten wir auch die nicht mit Escapezeichen versehene Version dieser Abfragezeichenfolge überprüfen:
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /unescapeQueryString:"True"
Konfigurationen
<configuration>
<system.webServer>
<security>
<requestFiltering unescapeQueryString="true">
<denyQueryStringSequences>
<add sequence="script" />
</denyQueryStringSequences>
</requestFiltering>
</security>
</system.webServer>
</configuration>
Bei der Überprüfung auf Muster in der Abfragezeichenfolge werden zwei Durchläufe ausgeführt, einer für die einfache Abfragezeichenfolge und einer für die nicht mit Escapezeichen versehene Abfragezeichenfolge.