Mise à jour 2: Après avoir écrit ce post, j’ai également découvert une autre vulnérabilité dans Trivia Crack qui permettait de donner aux utilisateurs des vies / tours illimités. À ce moment-là, j’ai ajouté ceci comme une autre fonctionnalité à Trivia Cracker. Hier (29/1/2016), Trivia Cracker a commencé à empêcher cette fonctionnalité (la réponse automatique aux questions continue de fonctionner — comme décrit dans cet article). Mais ce qui est drôle, c’est qu’en plus de l’empêcher, le serveur Trivia Crack m’appelle aussi spécifiquement!
Mise à jour 1: En utilisant des techniques similaires à celles ci-dessous, j’ai également publié une extension Chrome triche pour Candy Crush. Obtenez-le ici.
Alors que la saison des fêtes a commencé il y a quelques semaines, j’ai commencé à remarquer qu’une nouvelle application, Trivia Crack, devenait populaire auprès de mes amis. Pour ceux d’entre vous qui ne le savent pas, Trivia Crack est un nouveau jeu pour Android, iPhone et Facebook. La prémisse du jeu est simple et très similaire à une autre application populaire de l’année dernière, QuizUp. Essentiellement, vous répondez à des questions trivia de différentes catégories, en concurrence avec vos amis pour les droits de vantardise. Malgré la simplicité (ou peut–être à cause de cela), Trivia Crack est devenu très populaire depuis peu – accumulant 5,3 millions de likes sur Facebook et devenant la meilleure application gratuite du magasin Google Play (Android).
On pourrait penser que les développeurs d’un jeu aussi soigné et réussi auraient peut-être pris le temps de le mettre en œuvre de manière à ne pas tricher, mais il s’avère que l’écriture d’un programme pour tricher à Trivia Crack est en fait assez simple. Au cours d’un week-end, j’ai pu écrire et publier une extension Chrome, Trivia Cracker, qui m’a transformé d’un joueur de crack Trivia au meilleur de medicore à un demi-dieu apparemment génial. Vous pouvez voir Trivia Cracker en action ci-dessous:
Alors quel est le problème avec la mise en œuvre de Trivia Crack qui m’a permis de construire si facilement un outil qui permet à quiconque de tricher? En bref – lorsque le client Trivia Crack demande au serveur Trivia Crack la question suivante à poser à l’utilisateur, le serveur répond non seulement avec la question et les réponses possibles, mais envoie également la réponse qui est la bonne réponse. Les détails de la vulnérabilité, comment je l’ai trouvée et comment j’ai construit une extension Chrome pour en profiter sont ci-dessous.
1 – Trouver la vulnérabilité
Après avoir perdu contre mes amis dans Trivia Crack une fois de trop, j’ai décidé que je voulais voir si je pouvais gagner à ma manière. Bien que je ne sois pas si doué pour les anecdotes aléatoires, je suis plutôt doué pour la rétro-ingénierie. Je soupçonnais que je pourrais profiter de l’envoi de mes propres demandes aux serveurs de Trivia Crack, ou de l’utilisation de certaines données dans les réponses des serveurs de Trivia Crack, pour gagner un avantage dans le jeu. J’ai donc commencé par rechercher quels types de données le client et le serveur Trivia Crack transmettent d’avant en arrière.
Pour inspecter ces données, j’ai joué à Trivia Crack dans mon navigateur sur Facebook, tout en enregistrant et en inspectant les demandes et les réponses envoyées entre le client et le serveur de Trivia Crack à l’aide d’un outil que j’avais créé précédemment appelé Gargl. Oui, je sais que j’aurais pu utiliser les outils de développement de Fiddler ou de Chrome pour faire de même. J’ai décidé d’utiliser Gargl à la place car en plus de vous permettre d’afficher les demandes / réponses client / serveur, Gargl vous permet également de modifier et de paramétrer ces demandes, puis de générer automatiquement des modules dans un langage de programmation de votre choix afin que vous puissiez faire ces mêmes demandes sans écrire de ligne de code. Plus à ce sujet plus tard.Facebook Facebook, par rapport à Facebook lui-même.
Quoi qu’il en soit, après avoir dit à Gargl de commencer à enregistrer et d’aller à Trivia Crack sur Facebook dans mon navigateur, la première étape consistait à déterminer laquelle des nombreuses demandes envoyées sur cette page Facebook était liée à Trivia Crack, par rapport à Facebook lui-même. L’inspection du code HTML sur la page a montré que le contenu de Trivia Crack est intégré à Facebook via un iframe. L’élément juste au-dessus de cet iframe était un formulaire destiné à être posté sur une URL particulière – https://preguntados.com/game.
Ma connaissance limitée de l’espagnol m’a rappelé que « pregunta » signifie « question », ce qui semble lié à trivia, donc je soupçonnais que c’était le domaine où Trivia Crack est hébergé. Aller à l’URL https://preguntados.com/game a confirmé cette suspicion:
L’étape suivante consistait simplement à commencer à jouer à Trivia Crack, et pendant que je jouais, regardez les demandes que Gargl trouve que la page fait à n’importe quelle URL contenant « preguntados.com »:
Alors que j’ai répondu aux questions Trivia Crack, j’ai remarqué qu’une nouvelle demande semblait être émise pour chaque question. En fait, la demande semblait être émise avant même que je « tourne le fil » dans Trivia Crack pour déterminer quelle catégorie serait la prochaine question:
Cela m’a fait penser que les questions étaient peut-être prédéterminées, et le « spinner aléatoire » était en fait prédéterminé pour atterrir sur une certaine catégorie (et poser une certaine question) en fonction de la réponse du serveur au « spinner aléatoire ».api.preguntados.com/api/users /<userID > /games/<gameID > « demande envoyée avant de cliquer sur le bouton « Tourner ». Pour moi, cela signifiait que je pouvais probablement alerter l’utilisateur de la question qu’il allait lui être posée à l’avance, afin qu’il ait autant de temps qu’il le souhaitait pour y réfléchir ou le rechercher. Ce serait un avantage car dans Trivia Crack, vous n’avez que 30 secondes pour répondre à une question une fois que la question est affichée, pour empêcher l’utilisateur de rechercher des réponses. De plus, dans certains modes de jeu, ce n’est pas seulement le nombre de questions que vous obtenez correctement, mais aussi le temps que vous prenez pour répondre, qui détermine si vous gagnez. Si je pouvais montrer à l’utilisateur la question à l’avance, il pourrait évidemment y répondre beaucoup plus rapidement une fois que Trivia Crack lui-même montrera la question.
J’ai donc pensé que j’avais une piste et j’ai creusé dans les détails de cette demande. Il s’avère que cette demande a en fait fourni un « avantage du tricheur » beaucoup plus important que je ne le pensais
2 – La vulnérabilité en détail
En utilisant Gargl pour regarder l ‘ »api.preguntados.com/api/users/<userID>/games/<gameID> « demande / réponse en détail, j’ai pu confirmer qu’il fournit bien la question à poser, ainsi que les réponses possibles, dans la réponse. Cependant, j’ai été surpris de constater que la bonne réponse à la question est également intégrée dans la réponse!
Comme vous pouvez le voir ci-dessus, la réponse à cette demande contient la question, les réponses possibles et quel index dans le tableau des réponses possibles est la bonne réponse. Donc, si ces données concernent bien la question suivante, après avoir cliqué sur « Tourner », on devrait me demander « Lequel des pays africains suivants n’a pas de côte? »et la bonne réponse devrait être les réponses d’en haut, ce qui est « Ils le font tous ». Cliquer sur « Tourner » a prouvé que cette hypothèse était correcte:
J’ai également utilisé mon navigateur pour trouver que les requêtes GET répétées à « api.preguntados.com/api/users/<userID>/games/<gameID> « donnez toujours la même réponse, jusqu’à ce que vous répondiez à la question qu’il fournit. Cela signifie que je pourrais demander cette URL à partir de mon propre outil et recevoir toujours la même question que le client Trivia Crack sur Facebook recevrait.
Une réponse contenant la bonne réponse, lorsque le but est que l’utilisateur détermine lui–même la réponse, est en conflit direct avec la pratique de la programmation « Programmation défensive » – en particulier le principe de programmation Web « ne faites jamais confiance au client ». Étant donné que le serveur n’a aucun contrôle sur la façon dont le client agit, il ne peut pas supposer que le client n’agira pas de manière malveillante et doit donc se protéger. La bonne façon d’implémenter le comportement de vérification des réponses consiste à le faire côté serveur. N’envoyez pas la bonne réponse au client à tout moment, et obligez plutôt le client à envoyer la réponse de l’utilisateur au serveur, où le serveur vérifiera ensuite son exactitude et créditera l’utilisateur s’il est correct (et bien sûr, n’autorisez qu’une seule réponse par utilisateur par question).
Cependant, Trivia Crack ne l’a pas fait et fait plutôt confiance au client. Maintenant, il s’agissait simplement de créer un client malveillant pour profiter du fait que la bonne réponse est envoyée dans la réponse. Idéalement, celui qui serait facile à installer et à utiliser pour les utilisateurs non techniques. Hmmhow que diriez-vous d’une extension Chrome qui ajoute simplement un bouton au jeu de Trivia Crack, lorsqu’il est joué sur Facebook, qui, lorsqu’il est cliqué, répond correctement automatiquement à la question actuelle??
3 – Profitant de la vulnérabilité
Comme je l’ai mentionné ci-dessus, Gargl vous permet de prendre les requêtes que vous lui avez faites enregistrer, de les modifier et de les paramétrer au besoin, puis de générer automatiquement des modules dans un langage de programmation de votre choix pour effectuer ces mêmes requêtes. Je ne vais pas entrer dans les détails de ce processus car vous pouvez regarder l’un de mes articles de blog Gargl pour trouver ces informations, mais essentiellement, j’ai généré un fichier de modèle Gargl pour les différentes demandes d’API de Trivia Crack, en utilisant l’extension Gargl Chrome, puis j’ai utilisé un générateur Gargl pour transformer ce fichier de modèle en une bibliothèque JavaScript Trivia Crack. L’utilisation de Gargl pour cela m’a permis de créer une bibliothèque JavaScript qui parle aux serveurs de Trivia Crack, sans écrire une ligne de code pour le faire, et d’avoir également un fichier modèle pour l’avenir au cas où je voudrais faire la même chose plus tard pour un autre langage de programmation.
Une fois que j’ai eu cette bibliothèque JavaScript Trivia Crack, il était simple de créer une extension Chrome en JavaScript qui s’exécute sur le domaine chargé dans la page de jeu Facebook Trivia Crack iframe (preguntados.com ), ajoute un bouton au code HTML du jeu, et lorsque ce bouton est cliqué, demande l' »api.preguntados.com/api/users/<userID>/games/<gameID > »URL, analyse la réponse pour la bonne réponse, puis clique sur le bouton de réponse sur la page représentant la bonne réponse.