Sdílet prostřednictvím


Prevence útoků s otevřeným přesměrováním v ASP.NET Core

Webová aplikace, která přesměruje na adresu URL zadanou prostřednictvím požadavku, jako je například dotazovací řetězec nebo data formuláře, může být potenciálně manipulována s přesměrováním uživatelů na externí škodlivou adresu URL. Tato manipulace se nazývá otevřený útok přesměrování.

Pokaždé, když logika aplikace přesměruje na zadanou adresu URL, musíte ověřit, že adresa URL přesměrování nebyla manipulována. ASP.NET Core má integrované funkce, které pomáhají chránit aplikace před otevřeným přesměrováním (označované také jako otevřené přesměrování).

Co je otevřený útok přesměrovávání?

Webové aplikace často přesměrovávají uživatele na přihlašovací stránku, když přistupují k prostředkům, které vyžadují ověření. Přesměrování obvykle zahrnuje returnUrl parametr řetězce dotazu, aby se uživatel mohl vrátit na původně požadovanou adresu URL po úspěšném přihlášení. Po ověření se uživatel přesměruje na adresu URL, kterou původně požadoval.

Vzhledem k tomu, že cílová adresa URL je zadaná v dotazovacím řetězci požadavku, mohl by škodlivý uživatel manipulovat s řetězcem dotazu. Zfalšovaný dotazovací řetězec může webu umožnit přesměrování uživatele na externí škodlivý web. Tato technika se nazývá útok typu open redirect (neboli přesměrování).

Příklad útoku

Uživatel se zlými úmysly může vytvořit útok, který umožní škodlivému uživateli přístup k přihlašovacím údajům nebo citlivým informacím uživatele. Aby zahájil útok, uživatel se zlými úmysly přesvědčí uživatele, aby klikl na přihlašovací stránku vašeho webu s přidanou returnUrl hodnotou řetězce dotazu na adresu URL. Představte si například aplikaci contoso.com , která obsahuje přihlašovací stránku na adrese http://contoso.com/Account/LogOn?returnUrl=/Home/About. Útok se řídí těmito kroky:

  1. Uživatel klikne na škodlivý odkaz http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn (druhá adresa URL je contoso1.com, nikoli "contoso.com").
  2. Uživatel se úspěšně přihlásí.
  3. Uživatel je přesměrován (webem) na http://contoso1.com/Account/LogOn (škodlivý web, který vypadá přesně jako skutečný web).
  4. Uživatel se znovu přihlásí (dává škodlivému webu přihlašovací údaje) a přesměruje se zpět na skutečný web.

Uživatel se pravděpodobně domnívá, že první pokus o přihlášení selhal a že jeho druhý pokus je úspěšný. Uživatel s největší pravděpodobností neví, že jsou jejich přihlašovací údaje ohroženy.

Open Redirection Attack Process

Kromě přihlašovacích stránek poskytují některé weby stránky pro přesměrování nebo koncové body. Představte si, že vaše aplikace má stránku s otevřeným přesměrováním. /Home/Redirect Útočník může například vytvořit odkaz v e-mailu, na který přejde [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login. Typický uživatel se podívá na adresu URL a uvidí, že začíná názvem vašeho webu. Důvěřují tomu, že kliknou na odkaz. Otevřené přesměrování by pak poslalo uživatele na phishingový web, který vypadá stejně jako váš, a uživatel by se pravděpodobně přihlásil k tomu, co si myslí, že je váš web.

Ochrana před útoky s otevřeným přesměrováním

Při vývoji webových aplikací zacházejte se všemi uživateli poskytnutými daty jako nedůvěryhodnými. Pokud má vaše aplikace funkce, které uživatele přesměrují na základě obsahu adresy URL, zajistěte, aby se takové přesměrování provádělo jenom místně v rámci vaší aplikace (nebo na známou adresu URL, ne na adresu URL, která by mohla být zadána v řetězci dotazu).

LocalRedirect

Použijte pomocnou metodu LocalRedirect ze základní Controller třídy:

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

LocalRedirect vyvolá výjimku, pokud je zadána jiná než místní adresa URL. V opačném případě se chová stejně jako metoda Redirect .

IsLocalUrl

Před přesměrováním použijte metodu IsLocalUrl k otestování adres URL:

Následující příklad ukazuje, jak před přesměrováním zkontrolovat, jestli je adresa URL místní.

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

Tato IsLocalUrl metoda chrání uživatele před neúmyslným přesměrováním na škodlivý web. Podrobnosti o adrese URL, která byla zadána při zadání jiné než místní adresy URL, můžete protokolovat v situaci, kdy jste očekávali místní adresu URL. Adresy URL pro přesměrování protokolování můžou pomoct při diagnostice útoků přesměrování.