Découverte d’un XSS sur Chess.com
- En pratiquant les échecs comme loisir tout en m’amusant avec la technique, j’ai découvert une vulnérabilité XSS sur Chess.com.
- Chess.com est le plus grand site d’échecs sur Internet, avec plus de 100 millions de membres.
Vue d’ensemble
- J’ai commencé à passer beaucoup de temps sur Chess.com au début de 2023.
- J’ai fait s’inscrire un ami sur le site et nous sommes instantanément devenus amis grâce à la fonctionnalité dédiée.
- Je me suis demandé s’il était possible d’automatiser l’ajout d’amis, à la manière du ver MySpace.
- J’ai créé un nouveau compte et, en inspectant l’onglet réseau des outils de développement, j’ai trouvé l’URL d’ajout automatique d’amis.
Milieu de partie
- J’ai tenté une XSS en utilisant l’éditeur de texte enrichi TinyMCE.
- J’ai utilisé le proxy Burp pour injecter directement du code HTML dans la description « About ».
- Après avoir examiné la configuration de TinyMCE, j’ai créé une charge utile XSS en exploitant la propriété de style
background-image. - J’ai testé plusieurs symboles pour trouver comment déclencher l’exécution de la XSS.
- J’ai finalement mis au point une méthode permettant d’extraire les cookies et les objets JavaScript.
Finale
- J’ai travaillé à faire exécuter complètement la XSS.
- J’ai trouvé une nouvelle méthode utilisant l’attribut
srcset, qui permettait d’employer une syntaxe JS plus large. - J’ai exécuté directement la charge utile XSS en utilisant un encodage Base64.
- L’impact était important, car l’éditeur TinyMCE était utilisé sur l’ensemble du site.
Analyse
- La cause profonde de la vulnérabilité est la fonctionnalité de réimportation d’images.
- Il est possible de contourner la vérification de l’hébergement d’images en incluant le nom de domaine de Chess.com.
- L’éditeur de texte enrichi autorise divers éléments HTML, ce qui en fait un bon terrain pour parvenir à une XSS.
- TinyMCE était à jour, mais il manquait une sanitisation du HTML final.
- Chess.com devrait appliquer une sanitisation au HTML final affiché aux utilisateurs.
Avis de GN⁺ :
- Ce billet de blog décrit de manière intéressante le processus de découverte et de signalement d’une faille de sécurité pouvant survenir sur une grande plateforme en ligne comme Chess.com.
- Les vulnérabilités XSS peuvent constituer une menace grave pour la sécurité d’un site web, et les détecter puis les corriger est essentiel pour protéger les données personnelles des utilisateurs.
- Cet article souligne, pour les développeurs logiciels et les experts en sécurité, l’importance d’identifier les vulnérabilités des composants d’applications web comme les éditeurs de texte enrichi et de les prévenir.
1 commentaires
Commentaires Hacker News
Je suis l’OP. Merci beaucoup pour les commentaires positifs. Pour donner un peu de contexte, je suis un étudiant de 17 ans au Royaume-Uni, en train de préparer les A-Levels, et je réfléchis encore à l’université où aller ainsi qu’à l’option d’un degree apprenticeship
Vous pouvez voir mon profil GitHub ici -> https://github.com/Jayy001
Je suis l’un des membres clés de HashPals, j’ai créé Search-That-Hash, et je suis aussi mainteneur du dépôt open source de logiciels gratuits pour la tablette ReMarkable
Si tu veux en discuter davantage, n’hésite pas à me contacter ; mon e-mail est dans la description de mon profil
Et si vous partez dans l’IT, je vous conseille aussi d’apprendre la négociation de contrat et la finance
À l’époque où ma seule expérience d’Internet consistait à perdre à chaque fois comme « bibliothécaire bénévole » sur Chess.com, j’injectais dans des parties Chess.com en direct des caractères échappés maladroits, des balises fermantes, des chaînes de contrôle courantes, et même des objets OLE
Le fondateur, Eric, m’a poliment demandé un audit plus formel, mais j’ai refusé parce que je ne voulais pas révéler que j’étais un script kiddie de 11 ans. À la place, j’ai expliqué les expressions régulières nécessaires à la censure des salons de discussion, et nous avons aussi abordé le problème plus vaste de la détection de la triche dans un environnement asynchrone
Après réflexion, je lui ai dit que la seule méthode possible consistait à comparer tous les coups importants à forte valeur dans une partie avec les meilleurs coups connus d’un moteur, puis à utiliser l’inférence statistique pour distinguer les bons joueurs humains des tricheurs
Bien sûr, à l’époque, c’était une approche absurdement impossible, et c’est aussi la conclusion à laquelle nous étions arrivés. Mais cela reste un assez bon souvenir d’Internet : un enfant à peine sorti de l’école primaire discutant de sujets aussi subtils avec un vrai webmaster
Le passage « Cette fonctionnalité m’a rappelé le ver MySpace vers 2005, alors que je n’étais même pas né à l’époque ! » me fait sentir chaque jour un peu plus vieux
L’obstination à vouloir laisser les utilisateurs mettre du HTML sur le site posait d’énormes problèmes. Aujourd’hui, on analyserait correctement l’entrée HTML pour supprimer les attributs et balises interdits, mais à l’époque c’était traité à coups de regex délirantes
Je ne sais pas si c’est lié, mais j’ai déjà vu, et même enregistré, quelqu’un d’autre jouer mes coups à ma place dans une partie Chess.com. Il m’est aussi arrivé qu’une partie en cours apparaisse chez moi, et que je puisse jouer un coup dans une situation où je n’aurais normalement pas dû pouvoir le faire
En cherchant sur Google, on trouve pas mal de fils à ce sujet. Je ne sais pas si Chess.com l’a corrigé ces derniers mois, mais quand j’ai essayé de le signaler, ils n’ont pas voulu écouter
Toutes ces parties ont eu lieu alors que je n’étais pas connecté au site. Je n’ai jamais rencontré ça en étant connecté, mais les échecs ne sont pas bons pour ma tension, donc je n’y joue pas souvent
En lisant seulement le titre, je m’attendais à quelque chose de beaucoup plus débutant, mais en réalité il a créé un exploit qui contourne intelligemment plusieurs niveaux de validation des entrées. Il est même allé jusqu’à configurer un sous-domaine pour qu’il ressemble au domaine principal
Je ne m’attendais pas à ce que ça fonctionne, et c’est intéressant en soi. Quand on pense à la complexité du parsing de domaines avec des regex, on voit bien comment cela peut être facile à rater. Ou peut-être que c’était simplement une vérification de
'...'dans une variableL’auteur connaît bien son domaine. Je suis impressionné par le temps qu’il a dû passer à creuser pour atteindre ce niveau de compétence. Sa carrière devrait être assez intéressante
Bon article, OP. Je vous souhaite de poursuivre votre parcours dans le hacking. Si vous ne le savez pas encore, lorsque les parenthèses sont filtrées ou encodées dans des payloads comme
alert(1), vous pouvez essayer d’utiliser des backticks avecalert\1``Si vous voulez pousser l’injection JavaScript au niveau supérieur, la cheat sheet XSS de Brute Logic et JavaScript for Hackers de Gareth Heyes sont de bonnes ressources. Certains prennent le cross-site scripting à la légère, mais cela reste très puissant et très répandu. Surtout, comme plugin-baby l’a souligné, quand les cookies de session n’ont pas l’attribut HttpOnly
Très cool. J’aime lire les analyses de bug bounty, en particulier sur le XSS. Ça a toujours l’air facile à trouver, mais ce n’est que du biais de confirmation ; en réalité, je ne vois pas tout le temps passé sur des tests infructueux et des fausses pistes
Le passage « Cette fonctionnalité m’a rappelé le ver MySpace vers 2005, alors que je n’étais même pas né à l’époque ! » m’a immédiatement donné un coup de vieux
Ce que j’aimerais demander à l’OP à propos de cet incident, c’est comment il en a entendu parler. Était-ce via Darknet Diaries, ou autrement ?
J’ai trouvé amusant qu’il qualifie l’éditeur de texte enrichi de « Saint Graal ». Chess.com est un grand site web, mais chaque fois que je vois ce genre d’éditeur, ou des fonctionnalités trop tape-à-l’œil, sur de vieux forums, je me demande si le site n’est pas criblé de failles. Quoi qu’il en soit, excellent article
Le passage « Pendant le rapport de bug bounty et son examen, lorsque j’ai essayé de le reproduire à nouveau, les développeurs ont tenté de mettre en place un blocage et le message d’erreur suivant est apparu… » semble assez éloigné de l’esprit d’un programme de bug bounty