Verhindern von Open-Redirect-Angriffen in ASP.NET Core

Eine Web-App, die zu einer URL umleitet, die über die Anforderung wie beispielsweise die Abfragezeichenfolge oder Formulardaten angegeben wird, kann potenziell so manipuliert werden, dass Benutzer zu einer externen, schädlichen URL umgeleitet werden. Diese Manipulation wird als Open-Redirect-Angriff bezeichnet.

Wenn Ihre Anwendungslogik zu einer angegebenen URL umleitet, müssen Sie überprüfen, ob die Umleitungs-URL nicht manipuliert wurde. ASP.NET Core verfügt über integrierte Funktionalität zum Schutz von Apps vor Open-Redirect- bzw. Open-Redirection-Angriffen.

Was ist ein Open-Redirect-Angriff?

Webanwendungen leiten Benutzer häufig zu einer Anmeldeseite um, wenn sie auf Ressourcen zugreifen, die eine Authentifizierung erfordern. Die Umleitung enthält in der Regel in der Abfragezeichenfolge den Parameter returnUrl, damit der Benutzer nach erfolgreicher Anmeldung zur ursprünglich angeforderten URL zurückkehren kann. Nachdem sich der Benutzer authentifiziert hat, wird er zur URL umgeleitet, die er ursprünglich angefordert hat.

Da die Ziel-URL in der Abfragezeichenfolge der Anforderung angegeben ist, könnte ein böswilliger Benutzer die Abfragezeichenfolge manipulieren. Eine manipulierte Abfragezeichenfolge könnte es der Website ermöglichen, den Benutzer zu einer externen, schädlichen Website umzuleiten. Diese Technik wird als Open-Redirect- bzw. Open-Redirection-Angriff bezeichnet.

Beispiel eines Angriffs

Ein böswilliger Benutzer kann einen Angriff entwickeln, der ihm Zugriff auf die Anmeldeinformationen oder vertraulichen Informationen eines Benutzers ermöglichen soll. Um den Angriff einzuleiten, bringt der böswillige Benutzer den Benutzer dazu, auf einen Link zur Anmeldeseite Ihrer Website zu klicken, wobei der URL der Wert returnUrl in der Abfragezeichenfolge hinzugefügt wird. Nehmen wir als Beispiel eine App unter contoso.com, die eine Anmeldeseite unter http://contoso.com/Account/LogOn?returnUrl=/Home/About enthält. Der Angriff erfolgt in folgenden Schritten:

  1. Der Benutzer klickt auf einen schädlichen Link zu http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn (die zweite URL lautet contoso1.com, nicht contoso.com).
  2. Der Benutzer meldet sich erfolgreich an.
  3. Der Benutzer wird (von der Website) zu http://contoso1.com/Account/LogOn (einer schädlichen Website, die genauso aussieht wie die echte Website) umgeleitet.
  4. Der Benutzer meldet sich erneut an (und gibt seine Anmeldeinformationen an die schädliche Website weiter) und wird wieder zur echten Website umgeleitet.

Der Benutzer glaubt wahrscheinlich, dass sein erster Anmeldeversuch fehlgeschlagen ist und sein zweiter Versuch erfolgreich war. Dem Benutzer ist höchstwahrscheinlich nicht bewusst, dass seine Anmeldeinformationen kompromittiert wurden.

Open Redirection Attack Process

Zusätzlich zu Anmeldeseiten bieten einige Websites Umleitungsseiten oder Endpunkte an. Angenommen, Ihre App verfügt über eine Seite mit einer offenen Umleitung, /Home/Redirect. Ein Angreifer könnte z. B. einen Link in einer E-Mail erstellen, der zu [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login führt. Ein typischer Benutzer sieht sich die URL an und erkennt, dass sie mit dem Namen Ihrer Website beginnt. Im Vertrauen darauf klickt er auf den Link. Die offene Umleitung leitet den Benutzer dann zur Phishingwebsite, die genauso wie Ihre aussieht, und der Benutzer würde sich wahrscheinlich bei einer Website anmelden, die er für Ihre hält.

Schützen gegen Open-Redirect-Angriffe

Bei der Entwicklung von Webanwendungen sollten Sie alle vom Benutzer bereitgestellten Daten als nicht vertrauenswürdig behandeln. Wenn Ihre Anwendung über Funktionalität verfügt, die den Benutzer auf Grundlage des Inhalts der URL umleitet, stellen Sie sicher, dass solche Umleitungen nur lokal innerhalb Ihrer App erfolgen (oder zu einer bekannten URL, nicht zu einer URL, die möglicherweise in der Abfragezeichenfolge angegeben wird).

LocalRedirect

Verwenden Sie die Hilfsmethode LocalRedirect der Basisklasse Controller:

public IActionResult SomeAction(string redirectUrl)
{
    return LocalRedirect(redirectUrl);
}

LocalRedirect löst eine Ausnahme aus, wenn eine nicht lokale URL angegeben wird. Andernfalls verhält sie sich genau wie die Redirect-Methode.

IsLocalUrl

Verwenden Sie die IsLocalUrl-Methode, um URLs vor der Umleitung zu testen:

Das folgende Beispiel zeigt, wie Sie vor der Umleitung prüfen, ob eine URL lokal ist.

private IActionResult RedirectToLocal(string returnUrl)
{
    if (Url.IsLocalUrl(returnUrl))
    {
        return Redirect(returnUrl);
    }
    else
    {
        return RedirectToAction(nameof(HomeController.Index), "Home");
    }
}

Die IsLocalUrl-Methode schützt Benutzer vor versehentlicher Umleitung zu einer schädlichen Website. Sie können die Details der URL protokollieren, die bereitgestellt wurde, wenn eine nicht lokale URL in einer Situation bereitgestellt wird, in der Sie eine lokale URL erwartet haben. Die Protokollierung von Umleitungs-URLs kann bei der Diagnose von Redirect-Angriffen hilfreich sein.