Ist das Aktivieren von Double Escaping gefährlich?

136

Ich habe eine ASP.NET MVC-Anwendung mit einer Route, mit der über / search / <searchterm> nach Dingen gesucht werden kann.

Wenn ich "search / abc" gebe, funktioniert es gut, aber wenn ich "/ search / a + b + c" (korrekt url-codiert) gebe, lehnt IIS7 die Anforderung mit dem HTTP-Fehler 404.11 ab ( Das Anforderungsfiltermodul ist so konfiguriert, dass a verweigert wird Anfrage, die eine doppelte Escape-Sequenz enthält ). Zuallererst, warum macht es das? Es scheint den Fehler nur dann auszulösen, wenn er Teil der URL ist, aber nicht als Teil einer Abfragezeichenfolge (/ Transmit? Q = a + b + c funktioniert einwandfrei).

Jetzt könnte ich doppelte Escape-Anforderungen im Sicherheitsbereich meiner web.config aktivieren, aber ich zögere, dies zu tun, da ich die Auswirkungen nicht verstehe und auch nicht, warum der Server die Anforderung "a + b + c" als ablehnen würde Teil der URL, aber als Teil einer Abfragezeichenfolge akzeptieren.

Kann jemand erklären und Ratschläge geben, was zu tun ist?

Alex
quelle
7
Ich habe auch die möglicherweise korrektere Option zum Aufrufen von Server.Url Path Encode ausprobiert und landete /search/a%2520b%2520cim Markup , das zu einem schönen Fehler "Ein potenziell gefährlicher Request.Path-Wert wurde vom Client (%) erkannt" führte. Sie können anscheinend nicht gewinnen.
Zhaph - Ben Duguid

Antworten:

158

Bearbeiten: Hervorhebung der relevanten Abschnitte.

Grundsätzlich gilt: IIS ist übermäßig paranoid. Sie können diese Prüfung sicher deaktivieren, wenn Sie mit den uri-decodierten Daten nichts besonders Unkluges tun (z. B. das Generieren lokaler Dateisystem-URIs über die Verkettung von Zeichenfolgen).

Um die Prüfung zu deaktivieren, gehen Sie wie folgt vor (von hier aus ): (siehe meinen Kommentar unten für die doppelte Flucht).

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

Wenn das Plus - Symbol ein gültiges Zeichen in einer Sucheingabe ist, werden Sie brauchen , damit „allowDoubleEscaping“ zu ermöglichen , solche Eingabe zu verarbeiten , die von dem Pfad der URI IIS.

Schließlich besteht eine sehr einfache, wenn auch begrenzte Problemumgehung darin, einfach '+' zu vermeiden und stattdessen '% 20' zu verwenden. In jedem Fall ist die Verwendung des Symbols '+' zum Codieren eines Leerzeichens keine gültige URL-Codierung , sondern spezifisch für einen begrenzten Satz von Protokollen und wird wahrscheinlich aus Gründen der Abwärtskompatibilität weitgehend unterstützt. Wenn auch nur zu Kanonisierungszwecken, ist es sowieso besser, Leerzeichen als '% 20' zu codieren. und dies umgeht das IIS7-Problem (das bei anderen Sequenzen wie% 25ab immer noch auftreten kann).

Eamon Nerbonne
quelle
3
Ich würde die Prüfung deaktivieren. Dies ist mühsam und bietet den meisten Apps keine zusätzliche Sicherheit.
Eamon Nerbonne
3
Haben Sie einen Link / eine Referenz, über die das Deaktivieren der doppelten Flucht ziemlich sicher ist? Was genau verhindert diese Sicherheitsmaßnahme?
Alex
15
Wenn ein Uri doppelt entkommen ist, können die nicht entkoppelten Uri-Komponenten selbst reservierte Zeichen enthalten, und somit können (Teile) des nicht entkappten Uri selbst ein gültiger Uri sein. Kurz gesagt, wenn Sie die nicht entkappte uri-Zeichenfolge verwenden, um neue uri zu erstellen - insbesondere Dateisystempfade - und den neuen Pfad nicht korrekt zu umgehen, können Sie die Pfadinjektion zulassen. Die Pfadinjektion könnte es einem Angreifer ermöglichen, Ihr Programm dazu zu verleiten, Daten zu verarbeiten, die es nicht sollte, oder es zu verwirren, wenn es denkt, dass zwei Uris unterschiedlich sind, wenn sie tatsächlich identisch sind, aber einfach unterschiedlich codiert werden.
Eamon Nerbonne
4
@Stijn: Ja, das ist sicher . Bei dieser Überprüfung werden lediglich Anforderungen herausgefiltert, die möglicherweise durch fehlerhaften Code falsch interpretiert werden (insbesondere, wenn Sie Uri über String-Concat und ohne ordnungsgemäße Codierung doppelt dekodieren oder erstellen). Sie führen keinerlei Verarbeitung durch, das ist für Sie also so gut wie automatisch sicher. Jeder Fehler müsste im Basiscode für die Dateiservierung von IIS enthalten sein, und ich denke, wir können davon ausgehen, dass dieser Test inzwischen sehr, sehr gründlich getestet wurde. Auch dieser Check ist nichts Besonderes, er beschränkt sich nur auf Dinge, die möglicherweise dekodiert werden und dann wie ein codierter Uri aussehen .
Eamon Nerbonne
2

Ich möchte nur hinzufügen , einige Informationen zu Eamon Nerbonne Antwort auf den im Zusammenhang „ was zu tun ist “ Teil Ihrer Frage (nicht das Warum zu erklären).
Mit können Sie auch die Einstellungen einer bestimmten Anwendung problemlos ändern

  1. Öffnen der Konsole mit Administratorrechten (Start - cmd - Rechtsklick, Als Administrator ausführen)
  2. Geben Sie Folgendes ein (von hier aus: http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx ):

    %windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true

    (Sie können Ersatz zB YOURSITENAMEmit Default Web Sitefür die Anwendung dieser Regel auf die Standard - Website)

  3. Treten Sie ein, bereit.

Ein Beispiel:

  1. Erstens hatte ich das gleiche Problem: HTTP-Fehler 404.11 - Das Anforderungsfiltermodul ist so konfiguriert, dass eine Anforderung abgelehnt wird, die eine doppelte Escape-Sequenz enthält.
  2. Geben Sie den oben genannten Text ein: Drupal7-ein anderer Lösung für den HTTP-Fehler 404.11 - Das Anforderungsfiltermodul ist so konfiguriert, dass eine Anforderung abgelehnt wird, die eine doppelte Escape-Sequenz enthält.
  3. Jetzt funktioniert es wie erwartet: Lösung für den HTTP-Fehler 404.11 - Das Anforderungsfiltermodul ist so konfiguriert, dass eine Anforderung abgelehnt wird, die eine doppelte Escape-Sequenz enthält.
Sk8erPeter
quelle
1

Haben Sie darüber nachgedacht, eine Such-URL wie "/ search / a / b / c" zu haben?

Sie müssten eine Route wie einrichten

search/{*path}

Extrahieren Sie dann die Suchwerte aus Ihrer Pfadzeichenfolge in der Aktion.

HTHs
Charles

Charlino
quelle
Das Problem ist, dass andere URL-codierte Zeichen (einschließlich '/' selbst) Teil der Suche sein können.
Alex
Könnten Sie nicht alle '/', die tatsächlich Teil der Suche sind, in '% 2F' codieren?
Charlino
0

Ich bin unter IIS 7.5 auf einen Server.TransferRequest () in einer Anwendung gestoßen.

Das Codieren des Dateinamens verursachte das Double-Escape-Problem. Wenn ich es jedoch nicht codieren würde, würde der Fehler "potenziell gefährlich Request.Path" auftreten .

Das Problem wurde behoben, indem ein beliebiges Protokoll, auch ein leeres, in die URL eingefügt wurde, die ich an Server.TranferRequest () übergebe.

Funktioniert nicht:

context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");

Werke:

context.Server.TransferRequest("://folder/bar%20bar.jpg");
mhenry1384
quelle