Introduction. Vulnérabilité CSRF. Introduction aux verbes HTTP et CSRF

Cross Site Request Forgery, ou CSRF, est une attaque qui se produit lorsqu'un site, une lettre, un message, une application ou tout autre élément malveillant force le navigateur d'un utilisateur à effectuer une action sur un autre site où cet utilisateur est déjà authentifié. Cela se produit souvent à l'insu de l'utilisateur.

Les dommages causés par une attaque CSRF dépendent du site effectuant l'action. Voici un exemple :

  1. Bob se connecte à son compte personnel dans le client de banque en ligne, effectue certaines opérations, mais ne se déconnecte pas.
  2. Bob vérifie son courrier et clique sur un lien vers un site inconnu.
  3. Un site inconnu fait une demande au client en ligne de la banque de Bob pour transférer de l'argent, en transmettant des informations dans le cookie de Bob, conservées de sa session précédente.
  4. Site bancaire Bob accepte une demande d'un site inconnu (malveillant) sans utiliser de jeton CSRF et effectue la traduction.

Encore plus intéressante est la situation lorsqu'un lien vers un
le site peut être contenu en HTML valide, grâce auquel Bo-
vous n'avez même pas besoin de cliquer sur le lien : ... Si l'appareil de Bob (comme un navigateur) affiche
Si cette image est jointe, elle effectuera une requête sur malware_site.com et commettra potentiellement une attaque CSRF.

Maintenant, connaissant les dangers des attaques CSRF, vous pouvez vous défendre contre elles de différentes manières, dont la plus populaire est peut-être l'utilisation d'un jeton CSRF, qui doit être envoyé avec toute demande susceptible de modifier les données (par exemple, avec les requêtes POST). Une application Web (telle que la banque en ligne de Bob) devra générer un jeton en deux parties, l'une obtenue par Bob et l'autre stockée dans l'application.

Lorsque Bob essaie de faire une demande de transfert d'argent, il devra envoyer un jeton, dont la validité sera vérifiée par la banque à l'aide du jeton stocké dans l'application.

Maintenant que nous connaissons les jetons CSRF et CSRF, le partage de ressources d'origine croisée (CORS) devient plus clair, même si je viens peut-être de le remarquer en recherchant de nouvelles cibles. En général, CORS limite la liste des ressources pouvant accéder aux données. En d'autres termes, lorsque CORS est utilisé pour sécuriser un site, vous pouvez écrire du Javascript pour appeler l'application cible, lire la réponse et effectuer un autre appel si le site cible vous le permet.

Si cela vous semble déroutant, essayez d'utiliser Javascript pour appeler HackerOne.com/activity.json, lisez la réponse et passez un deuxième appel. Vous verrez également l'importance de cela et des solutions de contournement potentielles dans l'exemple n ° 3 ci-dessous.

Enfin, il est important de noter (merci à Jobert Abma de l'avoir signalé à ce stade) que toutes les requêtes sans jeton CSRF ne sont pas invalides. Certains sites peuvent effectuer des vérifications supplémentaires, telles que la comparaison de l'en-tête latéral sortant (bien que ce ne soit pas une garantie de sécurité et qu'il existe des solutions de contournement connues). Il s'agit d'un champ qui identifie l'adresse de la page qui renvoie à la ressource demandée. En d'autres termes, si le côté sortant (référent)

effectue un appel POST à ​​partir d'un site autre que le même site qui a reçu la requête HTTP, le site peut ne pas permettre à l'appel d'obtenir le même effet que celui obtenu à l'aide du jeton CSRF. De plus, tous les sites n'utilisent pas le terme csrf lors de la création ou de la définition d'un jeton. Par exemple, sur Badoo, il s'agit du paramètre rt, comme décrit ci-dessous.

Lire le guide de test OWASP pour les tests CSRF

Exemples de

1. Exporter les utilisateurs Shopify installés

Difficulté : Faible
URL : https://app.shopify.com/services/partners/api_clients/XXXX/export_installed_users


La description:

L'API Shopify fournit un point de terminaison pour exporter une liste d'utilisateurs installés via l'URL indiquée ci-dessus. La vulnérabilité était que le site pouvait faire une demande à ce point de terminaison et recevoir des informations en réponse, car

Shopify n'a pas utilisé de jeton CSRF pour valider cette demande. Par conséquent, le code HTML suivant pourrait être utilisé pour soumettre un formulaire au nom d'une victime sans méfiance.

1 2 csrf 3 4

7
8

9

Dans cet exemple, lors d'une simple visite de la page, Javascript soumet un formulaire qui inclut une requête GET à l'API Shopify à l'aide des cookies Shopify définis sur le navigateur de la victime.

conclusions

Augmentez vos attaques et recherchez les bogues non seulement sur le site Web, mais également dans l'API. Les points de terminaison de l'API sont également un terrain de jeu potentiel pour les vulnérabilités, il vaut donc la peine de garder cela à l'esprit, surtout si vous savez que l'API peut avoir été développée ou mise à disposition après la création de l'interface Web.

2. Déconnecter Shopify de Twitter

Difficulté : Faible
URL : https://twitter-commerce.shopifyapps.com/auth/twitter/disconnect

Shopify fournit une intégration Twitter qui permet aux propriétaires de magasins de tweeter sur leurs produits. De même, le service autorise et déconnecte le compte Twitter de la boutique associée.

L'URL pour déconnecter votre compte Twitter de la boutique est répertoriée ci-dessus. Lors de la demande, Shopify n'a pas validé le jeton CSRF, ce qui a permis à un attaquant de créer un faux lien, en cliquant sur lequel conduirait un propriétaire de magasin sans méfiance à déconnecter sa boutique de Twitter.

Décrivant la vulnérabilité, WeSecureApp a fourni l'exemple suivant d'une demande vulnérable, notez que l'utilisation de la balise img fait un appel à l'URL vulnérable :

1 GET / auth / twitter / Disconnect HTTP / 1.1 2 Host : twitter-commerce.shopifyapps.com 3 User-Agent : Mozilla / 5.0 (Macintosh ; Intel Mac OS X 10.1 4 1 ; rv : 43.0) Gecko / 20100101 Firefox / 43.0 5 Accepter : text/html, application/xhtml + xml, application/x 6 ml 7 Accept-Language : en-US, en; q = 0.5 8 Accept-Encoding : gzip, deflate 9 Referer : https://twitter-commerce .shopifyapps.com / accou 10 nt 11 Cookie : _twitter-commerce_session = SUPPRIMÉ 12> Connexion : keep-alive

Étant donné que le navigateur fait une demande GET pour obtenir l'image à partir de l'URL transmise et que le jeton CSRF n'est pas validé, le magasin personnalisé est désormais désactivé :

1 2 3 5

6

conclusions

Dans cette situation, la vulnérabilité décrite pouvait être trouvée lors de l'utilisation d'un serveur proxy tel que Burp ou Firefox Tamper Data, il suffisait de regarder la demande envoyée à Shopify et de voir que cette demande avait été faite à l'aide d'une demande GET. Étant donné que cela était destructeur et que les requêtes GET ne devraient pas modifier les données sur le serveur, cela vaut la peine d'être étudié.

3. Prise de contrôle complète du compte Badoo

Difficulté : Moyenne
URL : https://badoo.com
Lien du rapport : https://hackerone.com/reports/12770312
Date de déclaration : 1 avril 2016
Prime payée : 852 $

La description:

Si vous jetez un œil à Badoo, vous pouvez voir qu'ils sont protégés de CSRF en incluant le paramètre rt dans l'URL, qui ne fait que 5 caractères (au moins au moment de la rédaction). Bien que j'aie remarqué cela lorsque Badoo a lancé une campagne sur HackerOne, je n'ai pas trouvé le moyen de l'utiliser. Cependant, Mahmoud Jamal (zombiehelp54) l'a trouvé.

Après avoir compris la signification du paramètre rt, il a également remarqué que le paramètre était renvoyé dans presque toutes les réponses json. Malheureusement, cela n'a pas fait grand-chose car CORS protège Badoo des attaques en lisant ces réponses. Mahmoud a continué à chercher.

Il s'est avéré que le fichier https://eu1.badoo.com/worker-scope/chrome-ser contient la valeur rt. Mieux encore, ce fichier
pouvait être lu arbitrairement par l'attaquant et n'exigeait pas
les victimes ne prennent aucune autre mesure que de visiter une page Web malveillante. Voici le code qu'il a fourni :

1 2 3 Le compte Badoo prend le relais 4 6 7 8

Fondamentalement, lorsque la victime a chargé la page, elle a fait une demande au script Badoo, a pris le paramètre rt pour cet utilisateur, puis a fait la demande au nom de la victime. En l'occurrence, il s'agissait de lier le compte de Mahmoud au compte de la victime, ce qui a permis une prise de contrôle complète du compte.

conclusions

Là où il y a de la fumée, il y a du feu. Ici, Mahmoud a remarqué que le paramètre rt était renvoyé à différents endroits, dans des réponses json spécifiques. Il a donc correctement supposé qu'il pouvait être affiché quelque part où il pourrait être utilisé dans ce cas dans un fichier js.

Résultats

Les attaques CSRF représentent un autre vecteur dangereux d'attaques et peuvent être menées sans action active de la part de la victime ou même sans sa notification. Trouver les vulnérabilités CSRF nécessite une certaine ingéniosité et, encore une fois, la volonté de tout tester.

Généralement, les formulaires sont protégés par des frameworks par défaut comme Rails si le site fait une requête POST, mais les API peuvent

être une histoire à part. Par exemple, Shopify est principalement écrit sur la base du framework Ruby on Rails, qui fournit une protection CSRF pour tous les formulaires par défaut (bien qu'il puisse être désactivé). Cependant, il est clair que ce n'est pas forcément le cas pour les API construites avec ce framework. Enfin, recherchez les appels qui modifient les données sur le serveur (comme une action de suppression) et sont effectués à l'aide d'une requête GET.

ASP.NET MVC n'est pas la pile la plus en vogue, mais plutôt la plus populaire parmi les développeurs Web. Du point de vue d'un (anti)piratage, sa fonctionnalité standard vous offre une sécurité de base, mais une protection supplémentaire est nécessaire pour se prémunir contre la grande majorité des astuces des pirates. Dans cet article, nous passerons en revue les bases qu'un développeur ASP.NET (que ce soit Core, MVC, MVC Razor ou Web Forms) doit connaître la sécurité.

Commençons par tous les types d'attaques connus.

Injection SQL

Curieusement, mais en 2017, l'injection et, en particulier, l'injection SQL figurent à la première place parmi le « Top 10 des risques de sécurité OWASP » (Open Web Application Security Project). Ce type d'attaque implique que les données saisies par l'utilisateur soient utilisées côté serveur comme paramètres de requête.

L'exemple de l'injection SQL classique est plus typique pour les applications Web Forms. L'utilisation de paramètres comme valeurs de requête permet de se protéger contre les attaques :

String commandText = "UPDATE Users SET Status = 1 WHERE CustomerID = @ID;"; Commande SqlCommand = new SqlCommand (commandText, connectionString); command.Parameters ["@ ID"].Valeur = customerID ;

Si vous développez une application MVC, Entity Framework couvre certaines vulnérabilités. Obtenir une injection SQL qui fonctionne dans une application MVC/EF doit être délicat. Cependant, cela est possible si vous exécutez SQL à l'aide d'ExecuteQuery ou appelez des procédures stockées mal écrites.

Bien que ORM évite l'injection SQL (à l'exception des exemples ci-dessus), il est recommandé de restreindre les attributs aux valeurs que les champs du modèle, et donc les formulaires, peuvent prendre. Par exemple, s'il est supposé que seul du texte peut être saisi dans le champ, utilisez Regex pour spécifier la plage ^ + $. Et si des chiffres doivent être saisis dans le champ, indiquez-le comme une exigence :

Chaîne publique Zip (get; set;)

Dans Web Forms, vous pouvez limiter les valeurs à l'aide de validateurs. Exemple:

Depuis .NET 4.5, les formulaires Web utilisent la validation discrète. Cela signifie que vous n'avez pas besoin d'écrire de code supplémentaire pour valider la valeur du formulaire.

La validation des données, en particulier, peut aider à protéger contre une autre vulnérabilité bien connue appelée cross-site scripting (XSS).

XSS

Un exemple typique de XSS est l'ajout d'un script à une entrée de commentaire ou de livre d'or. Cela peut ressembler à ceci :

Comme vous pouvez l'imaginer, dans cet exemple, les cookies de votre site sont passés en paramètre à une ressource pirate.

Dans les formulaires Web, vous pouvez faire une erreur avec un code comme celui-ci :

Pardon<%= username %>mais le mot de passe est faux

Il est clair qu'à la place du nom d'utilisateur, il peut y avoir un script. Pour éviter l'exécution du script, vous pouvez au moins utiliser une autre expression ASP.NET : qui encode son contenu.

Si nous utilisons Razor, les chaînes sont automatiquement codées, ce qui minimise la possibilité d'implémentation XSS - un pirate informatique ne pourra le retirer que si vous faites une erreur grossière, par exemple, utilisez @ Html.Raw (Model.username) ou utilisez MvcHtmlString au lieu de string dans votre modèle.

Pour une protection supplémentaire contre XSS, les données sont également encodées en code C#. Dans NET Core, vous pouvez utiliser les encodeurs suivants à partir de l'espace de noms System.Text.Encodings.Web : HtmlEncoder, JavaScriptEncoder et UrlEncoder.

L'exemple suivant renverra la chaîne

Vous avez aimé l'article ? A partager entre amis :