Exigences : J’ai récemment lu le document ASP.NET Core de Microsoft « Prévenir les attaques de redirection ouverte dans ASP.NET Core », ce qui signifie en grosLes développeurs doivent prêter attention au chemin du site local lorsqu’ils passent à l’adresse de rappel afin d’éviter que certaines personnes ne falsifient malicieusement l’adresse de rappel pour des attaques de phishing。 Étudiez le code et préparez-vous à le porter sur le projet ASP.NET MVC.
Je me souviens qu’un grand fabricant avait déjà eu cette vulnérabilité, et certaines personnes l’utilisaient pour drainer le trafic de QQ et WeChat, comme suit :
Exploitant cette vulnérabilité, certains outils de discussion n’ont pas pu empêcher les utilisateurs de cliquer sur des liens pour accéder à un contenu malveillant de sites web en raison de leur confiance dans les grands domaines de l’entreprise.
Qu’est-ce qu’une attaque de redirection ouverte ?
Les applications web redirigent fréquemment les utilisateurs vers des pages de connexion lorsqu’ils accèdent à des ressources nécessitant une authentification. Les redirections incluent généralement un paramètre de requête returnUrl afin que les utilisateurs puissent revenir à l’URL initialement demandée après une connexion réussie. Après l’authentification, l’utilisateur est redirigé vers l’URL qu’il a initialement demandée.
Exemple d’attaque
Un utilisateur malveillant peut développer une attaque conçue pour donner à un utilisateur malveillant accès aux identifiants ou aux informations sensibles d’un utilisateur. Pour lancer une attaque, un utilisateur malveillant tromperait l’utilisateur en lui faisant cliquer sur un lien vers la page d’atterrissage de votre site et ajouterait la valeur de la chaîne de requête returnUrl à cette URL. afin decontoso.comPar exemple, l’application est danshttp://contoso.com/Account/LogOn?returnUrl=/Home/AboutContient une page d’atterrissage. L’attaque suit les étapes suivantes :
- L’utilisateur clique sur un lien malveillant vershttp://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(La deuxième URL est "contoso1.com« , au lieu de »contoso.com”) 。
- L’utilisateur se connecte avec succès.
- L’utilisateur est redirigé vers le sitehttp://contoso1.com/Account/LogOn(Un site malveillant qui ressemble exactement au vrai).
- L’utilisateur se reconnecte (en fournissant des identifiants au site malveillant) et est redirigé vers le site réel.
- Les utilisateurs peuvent penser que leur première tentative de connexion a échoué et que la seconde a réussi.Il est probable que les utilisateurs ne savent toujours pas que leurs identifiants ont été compromis。
En plus des pages d’atterrissage, certains sites proposent des pages de redirection ou des points de terminaison. Disons que votre application a une page qui inclut une redirection ouverte, /Home/Redirect. Par exemple, un attaquant pourrait créer un message dans un e-mail[yoursite]/Home/Redirect ?url=http ://phishingsite.com/Home/Loginlien. Les utilisateurs réguliers verront que l’URL commence par le nom de votre site. Par confiance, ils cliquent sur le lien. Ouvrez les redirections puis envoie les utilisateurs vers des sites de phishing qui ressemblent aux vôtres, et les utilisateurs peuvent se connecter à des sites qu’ils pensent être les vôtres.
Prévenir les attaques de redirection ouverte
Lors du développement d’applications web, toutes les données fournies par l’utilisateur sont considérées comme peu fiables. Si votre application a la capacité de rediriger les utilisateurs en fonction du contenu des URL, assurez-vous que ces redirections ne soient effectuées que localement dans votre application (ou redirigez vers des URL connues, pas vers celles fournies dans la chaîne de requêtes).
LocalRedirect
En utilisant la méthode d’aide Controller dans la classe de base LocalRedirect :
Si une URL non locale est spécifiée, LocalRedirect lance une exception. Sinon, il se comporte de la même manière que la méthode Redirect. Les informations sur les exceptions sont les suivantes :
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. Le code source est le suivant :
Processus d’exécution : LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl, et au final, IsLocalUrl sera appelé pour juger (UrlHelperFactory implémente par défaut l’interface IUrlHelperFactory. )。
Adresse du code source :La connexion hyperlientérée est visible.
IsLocalUrl
IsLocalUrl avant de rediriger, testez l’URL avec cette méthode :
Le code est le suivant :
Le code de test est le suivant :
Si vous êtes autorisé à accéder à d’autres sites de noms de domaine, vous pouvez implémenter l’interface IUrlHelperFactory et modifier IServiceCollection pour remplacer la classe d’implémentation par défaut au lancement du programme.
Référence:La connexion hyperlientérée est visible.
(Fin)
|