Empêcher les attaques de redirection ouvertes dans ASP.NET Core

Une application Web qui redirige vers une URL spécifiée via la requête, telle que la chaîne de requête ou les données du formulaire, peut potentiellement être falsifiée pour rediriger les utilisateurs vers une URL externe malveillante. Cette falsification est appelée une attaque de redirection ouverte.

Chaque fois que votre logique d'application redirige vers une URL spécifiée, vous devez vérifier que l'URL de redirection n'a pas été falsifiée. ASP.NET Core dispose d'une fonctionnalité intégrée pour aider à protéger les applications contre les attaques de redirection ouverte (également appelées redirection ouverte).

Qu'est-ce qu'une attaque par redirection ouverte ?

Les applications Web redirigent fréquemment les utilisateurs vers une page de connexion lorsqu'ils accèdent à des ressources nécessitant une authentification. La redirection inclut généralement un paramètre de chaîne de requête returnUrl afin que l'utilisateur puisse être renvoyé à l'URL demandée à l'origine après s'être connecté avec succès. Une fois l'utilisateur authentifié, il est redirigé vers l'URL initialement demandée.

Étant donné que l'URL de destination est spécifiée dans la chaîne de requête de la requête, un utilisateur malveillant pourrait falsifier la chaîne de requête. Une chaîne de requête altérée pourrait permettre au site de rediriger l'utilisateur vers un site externe malveillant. Cette technique est appelée une attaque de redirection ouverte (ou de redirection).

Un exemple d'attaque

Un utilisateur malveillant peut développer une attaque destinée à permettre à l'utilisateur malveillant d'accéder aux informations d'identification ou aux informations sensibles d'un utilisateur. Pour lancer l'attaque, l'utilisateur malveillant convainc l'utilisateur de cliquer sur un lien vers la page de connexion de votre site avec une valeur de chaîne de requête returnUrl ajoutée à l'URL. Par exemple, considérez une application sur contoso.com qui inclut une page de connexion sur http://contoso.com/Account/LogOn?returnUrl=/Home/About. L'attaque suit ces étapes :

  1. L'utilisateur clique sur un lien malveillant vers http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn (la deuxième URL est « contoso1.com », et non « contoso.com »).
  2. L'utilisateur se connecte avec succès.
  3. L'utilisateur est redirigé (par le site) vers http://contoso1.com/Account/LogOn (un site malveillant qui ressemble exactement au site réel).
  4. L'utilisateur se reconnecte (en donnant au site malveillant ses informations d'identification) et est redirigé vers le site réel.

L'utilisateur pense probablement que sa première tentative de connexion a échoué et que sa deuxième tentative a réussi. L'utilisateur ignore très probablement que ses informations d'identification sont compromises.

Open Redirection Attack Process

En plus des pages de connexion, certains sites proposent des pages de redirection ou des points de terminaison. Imaginez que votre application ait une page avec une redirection ouverte, /Home/Redirect. Un attaquant pourrait créer, par exemple, un lien dans un e-mail qui va vers [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login. Un utilisateur typique regardera l'URL et verra qu'elle commence par le nom de votre site. En faisant confiance, ils cliqueront sur le lien. La redirection ouverte enverrait alors l'utilisateur vers le site de phishing, qui semble identique au vôtre, et l'utilisateur se connecterait probablement à ce qu'il pense être votre site.

Protection contre les attaques par redirection ouverte

Lors du développement d'applications Web, traitez toutes les données fournies par l'utilisateur comme non fiables. Si votre application dispose d'une fonctionnalité qui redirige l'utilisateur en fonction du contenu de l'URL, assurez-vous que ces redirections ne sont effectuées que localement dans votre application (ou vers une URL connue, et non vers une URL pouvant être fournie dans la chaîne de requête).

LocalRedirect

Utilisez la méthode d'assistance LocalRedirect de la classe de base Controller :

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

LocalRedirect lèvera une exception si une URL non locale est spécifiée. Sinon, il se comporte exactement comme la méthode Redirect.

IsLocalUrl

Utilisez la méthode IsLocalUrl pour tester les URL avant de rediriger :

L'exemple suivant montre comment vérifier si une URL est locale avant la redirection.

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

La méthode IsLocalUrl empêche les utilisateurs d'être redirigés par inadvertance vers un site malveillant. Vous pouvez enregistrer les détails de l'URL qui a été fournie lorsqu'une URL non locale est fournie dans une situation où vous attendiez une URL locale. La journalisation des URL de redirection peut aider à diagnostiquer les attaques de redirection.