Anforderungen: Ich habe kürzlich Microsofts ASP.NET Core-Dokument "Preventing Open Redirect Attacks in ASP.NET Core" gelesen, was ungefähr bedeutet.Entwickler sollten beim Springen zur Rückrufadresse auf den Pfad der lokalen Seite achten, um zu verhindern, dass einige Personen die Rückrufadresse böswillig für Phishing-Angriffe fälschen。 Studieren Sie den Code und bereiten Sie sich darauf vor, ihn zum ASP.NET MVC-Projekt zu portieren.
Ich erinnere mich, dass ein großer Hersteller diese Schwachstelle schon einmal hatte, und einige Leute sie genutzt haben, um Traffic von QQ und WeChat abzuziehen, wie folgt:
Einige Chat-Tools nutzten die Schwachstelle aus, sodass Nutzer aufgrund ihres Vertrauens in große Unternehmensdomains auf Links klickten, um auf bösartige Webseiteninhalte zuzugreifen.
Was ist ein offener Umleitungsangriff?
Webanwendungen leiten Nutzer häufig auf Login-Seiten um, wenn sie auf Ressourcen zugreifen, die eine Authentifizierung erfordern. Weiterleitungen enthalten typischerweise einen returnUrl-Abfragestring-Parameter, sodass Nutzer nach erfolgreichem Login zur ursprünglich angeforderten URL zurückkehren können. Nachdem der Nutzer authentifiziert ist, wird er auf die ursprünglich gewünschte URL weitergeleitet.
Beispiel für einen Angriff
Ein böswilliger Nutzer kann einen Angriff entwickeln, der darauf abzielt, einem böswilligen Nutzer Zugang zu den Zugangsdaten oder sensiblen Informationen eines Nutzers zu gewähren. Um einen Angriff zu starten, würde ein böswilliger Nutzer den Nutzer dazu bringen, auf einen Link zur Landingpage Ihrer Seite zu klicken und den returnUrl-Abfragestring zu dieser URL hinzuzufügen. umcontoso.comZum Beispiel ist die App inhttp://contoso.com/Account/LogOn?returnUrl=/Home/AboutEnthält eine Landingpage. Der Angriff folgt folgenden Schritten:
- Der Nutzer klickt auf einen bösartigen Link, umhttp://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(Die zweite URL lautet "contoso1.com", statt "contoso.com”) 。
- Der Nutzer meldet sich erfolgreich an.
- Der Nutzer wird auf die Seite weitergeleitethttp://contoso1.com/Account/LogOn(Eine bösartige Seite, die genauso aussieht wie die echte).
- Der Nutzer meldet sich erneut an (gibt der bösartigen Seite Zugangsdaten an) und wird zurück zur echten Seite weitergeleitet.
- Nutzer denken vielleicht, dass ihr erster Login-Versuch gescheitert ist und der zweite erfolgreich war.Wahrscheinlich wissen Nutzer immer noch nicht, dass ihre Zugangsdaten kompromittiert wurden。
Neben Landingpages bieten einige Seiten auch Weiterleitungsseiten oder Endpunkte an. Angenommen, deine App hat eine Seite, die eine offene Weiterleitung enthält, /Home/Redirect. Zum Beispiel könnte ein Angreifer einen Punkt in einer E-Mail erstellen[yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Loginverbinden. Regelmäßige Nutzer sehen, dass die URL mit deinem Seitennamen beginnt. Aus Vertrauen klicken sie auf den Link. Offene Weiterleitungen leiten Nutzer dann zu Phishing-Seiten, die wie Ihre aussehen, und Nutzer können sich auf Seiten einloggen, von denen sie glauben, dass sie Ihre sind.
Offene Umleitungsangriffe verhindern
Bei der Entwicklung von Webanwendungen werden alle vom Nutzer bereitgestellten Daten als unzuverlässig behandelt. Wenn Ihre App die Möglichkeit hat, Nutzer basierend auf URL-Inhalten umzuleiten, stellen Sie sicher, dass solche Weiterleitungen nur lokal in Ihrer App erfolgen (oder auf bekannte URLs, nicht auf URLs, die im Abfragestring angegeben sind).
LocalRedirect
Verwendung der Controller-Hilfsmethode in der LocalRedirect-Basisklasse:
Wenn eine nicht-lokale URL angegeben ist, wirft LocalRedirect eine Ausnahme. Ansonsten verhält es sich genauso wie die Redirect-Methode. Die Ausnahmeinformationen sind wie folgt:
InvalidOperationException: The supplied URL is not local. A URL with an absolute path is considered local if it does not have a host/authority part. URLs using virtual paths ('~/') are also local. Der Quellcode ist wie folgt:
Ausführungsprozess: LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl, und am Ende wird IsLocalUrl zum Judge aufgerufen (UrlHelperFactory implementiert standardmäßig die IUrlHelperFactory-Schnittstelle). )。
Quellcode-Adresse:Der Hyperlink-Login ist sichtbar.
IsLocalUrl
IsLocalUrl testen Sie vor der Weiterleitung die URL mit folgender Methode:
Der Code lautet wie folgt:
Der Testcode ist wie folgt:
Wenn Sie zu anderen Domain-Name-Seiten springen dürfen, können Sie die IUrlHelperFactory-Oberfläche implementieren und IServiceCollection so modifizieren, dass die Standard-Implementierungsklasse beim Start des Programms ersetzt wird.
Referenz:Der Hyperlink-Login ist sichtbar.
(Ende)
|