In meiner ASP.NET MVC-Anwendung versuche ich, eine URL wie die folgende zu implementieren:
/ product / tags / für + Familien
Wenn ich versuche, meine Anwendung mit Standardkonfigurationen auszuführen, wird folgende Meldung mit dem 404.11-Antwortcode angezeigt:
HTTP-Fehler 404.11 - Nicht gefunden
Das Anforderungsfiltermodul ist so konfiguriert, dass eine Anforderung abgelehnt wird, die eine doppelte Escape-Sequenz enthält.
Ich kann diesen Fehler umgehen, indem ich den folgenden Code in meine web.config implementiere:
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true" />
</security>
</system.webServer>
Also, jetzt bekomme ich keine 404.11
.
Was ich mich frage, ist, welche Art von Sicherheitslücken ich mit dieser Implementierung öffne.
Übrigens ist meine Anwendung unter .Net Framework 4.0
und läuft unter IIS 7.5
.
asp.net
asp.net-mvc
asp.net-mvc-3
iis
iis-7
Tugberk
quelle
quelle
/product/tags/for%20families
stattdessen die gewünschte Ressource zu erreichen ? Dann haben Sie eine Problemumgehung für IDs, die Leerzeichen enthalten. Oder bin ich hier komplett weg?Antworten:
Die Sicherheitslücken, die Sie möglicherweise öffnen, haben mit der Code-Injection zu tun - HTML-Injection, JavaScript-Injection oder SQL-Injection.
Die Standardeinstellungen schützen Sie vor Angriffen, indem Sie nicht zulassen, dass gängige Injektionsstrategien funktionieren. Je mehr Standardsicherheit Sie entfernen, desto mehr müssen Sie darüber nachdenken, was Sie mit den Eingaben tun, die über URLs, GET-Anforderungsabfrageringe, POST-Anforderungsdaten, HTTP-Header usw. bereitgestellt werden.
Wenn Sie beispielsweise dynamische SQL-Abfragen basierend auf dem
id
Parameter Ihrer Aktionsmethode erstellen, gehen Sie wie folgt vor:public ActionResult Tags(string id) { var sql = "SELECT * FROM Tags Where tagName = '" + id + "'"; // DO STUFF... }
(... was keine gute Idee ist), der vom .NET Framework eingerichtete Standardschutz kann einige der gefährlicheren Szenarien stoppen, z. B. den Benutzer, der diese URL anfordert:
/product/tags/1%27;drop%20table%20Tags;%20--
Die ganze Idee ist, jeden Teil von URLs und anderen Eingaben in Aktionsmethoden als mögliche Bedrohungen zu behandeln. Die Standardsicherheitseinstellung bietet Ihnen einen Teil dieses Schutzes. Jede von Ihnen geänderte Standardsicherheitseinstellung öffnet sich für ein wenig mehr potenzielle Fehler, die Sie manuell behandeln müssen.
Ich gehe davon aus, dass Sie keine SQL-Abfragen auf diese Weise erstellen. Aber das hinterhältigere Zeug kommt, wenn Sie Benutzereingaben in Ihrer Datenbank speichern und sie später anzeigen. Der böswillige Benutzer könnte JavaScript oder HTML in Ihrer Datenbank speichern, die nicht codiert sind, was wiederum andere Benutzer Ihres Systems bedrohen würde.
quelle
Sicherheitsrisiko
Die Einstellung
allowDoubleEscaping
gilt nur für denpath
(cs-uri-stem) und wird am besten durch OWASP Double Encoding erklärt . Die Technik wird verwendet, um Sicherheitskontrollen durch zweimaliges URL-Codieren der Anforderung zu umgehen. Verwenden Sie Ihre URL als Beispiel:/product/tags/for+families --> /product/tags/for%2Bfamilies --> /product/tags/for%252Bfamilies
Angenommen, es gibt Sicherheitskontrollen speziell für
/product/tags/for+families
. Es kommt eine Anforderung an, für/product/tags/for%252Bfamilies
die dieselbe Ressource vorhanden ist, die jedoch von den oben genannten Sicherheitskontrollen nicht überprüft wird. Ich habe den allgemeinen Begriff der Sicherheitskontrollen verwendet, da dies beispielsweise die Anforderung eines authentifizierten Benutzers, die Suche nach SQLi usw. sein kann.Warum blockiert IIS?
Das Pluszeichen (+) ist ein reserviertes Zeichen gemäß RFC2396 :
Wade Hilmo hat einen ausgezeichneten Beitrag mit dem Titel Wie IIS Zeichen in URLs blockiert . Es gibt viele Informationen und Hintergrundinformationen. Der Teil speziell für das Pluszeichen lautet wie folgt:
Aus eigener Erfahrung weiß ich, dass bei IIS-Protokollen Anforderungsbereiche durch ein Pluszeichen ersetzt werden. Ein Pluszeichen im Namen kann beim Parsen von Protokollen zu Verwirrung führen.
Lösung
Es gibt drei Möglichkeiten, dies zu beheben, und zwei Möglichkeiten, das Pluszeichen weiterhin zu verwenden.
allowDoubleEscaping=true
- Dies ermöglicht eine doppelte Flucht für Ihre gesamte Website / Anwendung. Je nach Inhalt kann dies gelinde gesagt unerwünscht sein. Der folgende Befehl wird gesetztallowDoubleEscaping=true
.appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /allowDoubleEscaping:True
alwaysAllowedUrls
- Request Filtering bietet einen Whitelist-Ansatz. Durch Hinzufügen dieses URL-Pfads zu alwaysAllowedUrls wird die Anforderung nicht durch andere Einstellungen für die Anforderungsfilterung überprüft und in der IIS-Anforderungspipeline fortgesetzt. Hier besteht die Sorge, dass die Anforderungsfilterung die Anforderung nicht überprüft auf:Der folgende Befehl hinzufügen ,
/product/tags/for+families
umalwaysAllowedUrls
auf der Standard-Website.appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"alwaysAllowedUrls.[url='/product/tags/for+families']"
Umbenennen - ja, benennen Sie einfach die Datei / Ordner / Controller / etc. Um. wenn möglich. Dies ist die einfachste Lösung.
quelle
Ich habe dafür eine Arbeit gemacht. Wenn Sie also die geschriebene Zeichenfolge in die URL für (IIS) einfügen möchten, müssen Sie sie von Schmutz befreien: {";", "/", "?", ":", "@", "&", " = "," + "," $ ",", "}; und wenn Sie es beschreiben und erneut verwenden möchten, müssen Sie es erneut verschmutzen, bevor Sie es beschreiben (um das gewünschte Ergebnis zu erhalten).
Hier ist mein Code, ich hoffe er hilft jemandem:
public static string cleanUpEncription(string encriptedstring) { string[] dirtyCharacters = { ";", "/", "?", ":", "@", "&", "=", "+", "$", "," }; string[] cleanCharacters = { "p2n3t4G5l6m","s1l2a3s4h","q1e2st3i4o5n" ,"T22p14nt2s", "a9t" , "a2n3nd","e1q2ua88l","p22l33u1ws","d0l1ar5","c0m8a1a"}; foreach (string dirtyCharacter in dirtyCharacters) { encriptedstring=encriptedstring.Replace(dirtyCharacter, cleanCharacters[Array.IndexOf(dirtyCharacters, dirtyCharacter)]); } return encriptedstring; } public static string MakeItDirtyAgain(string encriptedString) { string[] dirtyCharacters = { ";", "/", "?", ":", "@", "&", "=", "+", "$", "," }; string[] cleanCharacters = { "p2n3t4G5l6m", "s1l2a3s4h", "q1e2st3i4o5n", "T22p14nt2s", "a9t", "a2n3nd", "e1q2ua88l", "p22l33u1ws", "d0l1ar5", "c0m8a1a" }; foreach (string symbol in cleanCharacters) { encriptedString = encriptedString.Replace(symbol, dirtyCharacters[Array.IndexOf(cleanCharacters,symbol)]); } return encriptedString; }
quelle
base64
anstelle dieser Substitutionstechnik codiert werden. Beispielsweise verwendetbase64
die Basisauthentifizierung die Codierung der übermittelten Anmeldeinformationen, da diese Sonderzeichen / reservierte Zeichen enthalten können.Ich bin darauf gestoßen, als ich eine API von einer MVC-App aus aufgerufen habe. Anstatt die Sicherheitslücke zu öffnen, habe ich meinen Pfad geändert.
Zunächst einmal empfehle ich, diese Einstellung NICHT zu deaktivieren. Es ist besser, das Design der Anwendung / Ressource zu ändern (z. B. den Pfad codieren, die Daten in einem Header oder im Body übergeben).
Obwohl dies ein älterer Beitrag ist, dachte ich, ich würde mitteilen, wie Sie diesen Fehler beheben können, wenn Sie diesen von einem Aufruf einer API mithilfe der HttpUtility.UrlPathEncode- Methode in System.Web erhalten .
Ich verwende RestSharp zum Tätigen von Anrufen, daher verwende mein Beispiel die RestRequest:
var tags = new[] { "for", "family" }; var apiRequest = new RestRequest($"product/tags/{HttpUtility.UrlPathEncode(string.Join("+", tags))}");
Dies erzeugt einen Pfad gleich:
Erstellen Sie in einem anderen Fall KEINE dynamische Abfrage, die auf den Eingaben eines Benutzers basiert. Sie sollten immer einen SqlParameter verwenden . Aus Sicherheitsgründen ist es außerdem äußerst wichtig, die Werte mit der entsprechenden Codierung zurückzugeben, um Injektionsangriffe zu verhindern.
~ Prost
quelle
Codieren Sie die verschlüsselte Zeichenfolge getrennt:
return HttpServerUtility.UrlTokenEncode(Encoding.UTF8.GetBytes("string"));
Dekodieren Sie die verschlüsselte Zeichenfolge getrennt:
string x = Encoding.UTF8.GetString(HttpServerUtility.UrlTokenDecode(id));
quelle