Share via


Impedire attacchi di reindirizzamento aperti in ASP.NET Core

Un'app Web che reindirizza a un URL specificato tramite la richiesta, ad esempio la stringa di query o i dati del modulo, può essere manomessa per reindirizzare gli utenti a un URL esterno e dannoso. Questa manomissione è detta attacco di reindirizzamento aperto.

Ogni volta che la logica dell'applicazione reindirizza a un URL specificato, è necessario verificare che l'URL di reindirizzamento non sia stato manomesso. ASP.NET Core include funzionalità predefinite per proteggere le app da attacchi di reindirizzamento aperto (noto anche come reindirizzamento aperto).

Che cos'è un attacco di reindirizzamento aperto?

Le applicazioni Web reindirizzano spesso gli utenti a una pagina di accesso quando accedono alle risorse che richiedono l'autenticazione. Il reindirizzamento include in genere un returnUrl parametro querystring in modo che l'utente possa essere restituito all'URL originariamente richiesto dopo l'accesso. Dopo l'autenticazione dell'utente, viene reindirizzato all'URL richiesto in origine.

Poiché l'URL di destinazione viene specificato nella stringa di query della richiesta, un utente malintenzionato potrebbe manomettere la stringa di query. Una querystring manomessa potrebbe consentire al sito di reindirizzare l'utente a un sito esterno dannoso. Questa tecnica è detta attacco di reindirizzamento aperto (o reindirizzamento).

Un esempio di attacco

Un utente malintenzionato può sviluppare un attacco destinato a consentire all'utente malintenzionato di accedere alle credenziali o alle informazioni riservate di un utente. Per iniziare l'attacco, l'utente malintenzionato convince l'utente a fare clic su un collegamento alla pagina di accesso del sito con un returnUrl valore querystring aggiunto all'URL. Si consideri, ad esempio, un'app in contoso.com che include una pagina di accesso in http://contoso.com/Account/LogOn?returnUrl=/Home/About. L'attacco segue questa procedura:

  1. L'utente fa clic su un collegamento dannoso a http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn (il secondo URL è "contoso1.com", non "contoso.com").
  2. L'utente accede correttamente.
  3. L'utente viene reindirizzato (dal sito) a http://contoso1.com/Account/LogOn (un sito dannoso che appare esattamente come un sito reale).
  4. L'utente accede nuovamente (dando le credenziali al sito dannoso) e viene reindirizzato al sito reale.

L'utente ritiene probabilmente che il primo tentativo di accesso non sia riuscito e che il secondo tentativo abbia esito positivo. L'utente rimane probabilmente inconsapevole che le credenziali siano compromesse.

Open Redirection Attack Process

Oltre alle pagine di accesso, alcuni siti forniscono pagine di reindirizzamento o endpoint. Si supponga che l'app abbia una pagina con un reindirizzamento aperto, /Home/Redirect. Un utente malintenzionato potrebbe creare, ad esempio, un collegamento in un messaggio di posta elettronica che passa a [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login. Un utente tipico esaminerà l'URL e vedrà che inizia con il nome del sito. Considera attendibile che, farà clic sul collegamento. Il reindirizzamento aperto invierà quindi l'utente al sito di phishing, che sembra identico al proprio e l'utente probabilmente accederà a ciò che ritiene sia il sito.

Protezione da attacchi di reindirizzamento aperti

Quando si sviluppano applicazioni Web, considerare tutti i dati forniti dall'utente come non attendibili. Se l'applicazione dispone di funzionalità che reindirizzano l'utente in base al contenuto dell'URL, assicurarsi che tali reindirizzamenti vengano eseguiti solo in locale all'interno dell'app (o a un URL noto, non qualsiasi URL che può essere fornito nella querystring).

LocalRedirect

Usare il LocalRedirect metodo helper dalla classe base Controller :

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

LocalRedirect genererà un'eccezione se viene specificato un URL non locale. In caso contrario, si comporta esattamente come il Redirect metodo .

IsLocalUrl

Usare il IsLocalUrl metodo per testare gli URL prima del reindirizzamento:

Nell'esempio seguente viene illustrato come verificare se un URL è locale prima del reindirizzamento.

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

Il IsLocalUrl metodo protegge gli utenti dal reindirizzamento accidentale a un sito dannoso. È possibile registrare i dettagli dell'URL fornito quando viene fornito un URL non locale in una situazione in cui è previsto un URL locale. Gli URL di reindirizzamento della registrazione possono aiutare a diagnosticare gli attacchi di reindirizzamento.