Update 2: Na het schrijven van dit bericht ontdekte ik ook een andere kwetsbaarheid in Trivia Crack die het mogelijk maakte voor het geven van gebruikers onbeperkt leven / spins. Op dat moment heb ik dit als een andere functie toegevoegd aan Trivia Cracker. Gisteren (29/12/2016), Trivia Cracker begonnen met het voorkomen van deze functie (Automatisch vragen beantwoorden blijft werken — zoals beschreven in dit bericht). Maar wat grappig is, naast het voorkomen van het, de Trivia Crack server roept me ook specifiek!
Update 1: met behulp van soortgelijke technieken als hieronder, heb ik ook een cheating Chrome extensie voor Candy Crush uitgebracht. Zorg dat het hier komt.
toen het vakantieseizoen een paar weken geleden begon, begon ik te merken dat een nieuwe app, Trivia Crack, populair werd bij mijn vrienden. Voor degenen onder u die het niet weten, Trivia Crack is een nieuw spel voor Android, iPhone, en Facebook. Het uitgangspunt van het spel is eenvoudig, en zeer vergelijkbaar met een andere populaire app van vorig jaar, QuizUp. In wezen beantwoord je trivia vragen van verschillende categorieën, wedijveren tegen je vrienden voor het recht om op te scheppen. Ondanks de eenvoud (of misschien te wijten aan het), Trivia Crack is erg populair geworden als van de late – rekken tot 5.3 miljoen likes op Facebook en steeds de top gratis app in de Google Play (Android) winkel.
je zou denken dat de ontwikkelaars van zo ‘ n gepolijst en succesvol spel de tijd hebben genomen om het te implementeren op een manier die veilig is om vals te spelen, maar het blijkt dat het schrijven van een programma om vals te spelen bij Trivia Crack eigenlijk vrij eenvoudig is. In de loop van een weekend, Ik was in staat om te schrijven en release van een Chrome extensie, Trivia Cracker, dat draaide me van een medicore-op-best Trivia Crack speler om een schijnbaar geniale halfgod. Je kunt hieronder Trivia Cracker in actie zien:
dus wat is er mis met de implementatie van Trivia Crack waardoor ik zo gemakkelijk een tool kon bouwen waarmee iedereen vals kan spelen? In het kort-wanneer de Trivia Crack client van de Trivia Crack server de volgende vraag aan de gebruiker vraagt, antwoordt de server niet alleen met de vraag en de mogelijke antwoorden, maar stuurt ook het antwoord dat het juiste antwoord is. De details van de kwetsbaarheid, hoe ik vond het, en hoe ik bouwde een Chrome-extensie om te profiteren van het zijn hieronder.
1 – het vinden van de kwetsbaarheid
na het verliezen van mijn vrienden in Trivia Crack een te vaak, besloot ik dat ik wilde zien of ik kon winnen op mijn eigen, speciale manier. Hoewel ik niet zo goed ben in willekeurige trivia, ben ik best goed in reverse-engineering. Ik vermoedde dat ik zou kunnen profiteren van het verzenden van mijn eigen verzoeken aan Trivia Crack servers, of met behulp van een aantal gegevens in de reacties van Trivia Crack servers, om een voorsprong in het spel te krijgen. Dus begon ik te onderzoeken wat voor soort gegevens De Trivia Crack client en server heen en weer doorgeven.
om deze gegevens te inspecteren, speelde ik Trivia Crack in mijn browser op Facebook, terwijl ik de verzoeken en antwoorden die tussen de client en server van Trivia Crack werden verzonden, opnam en inspecteerde met behulp van een tool die ik eerder had gemaakt met de naam Gargl. Ja, ik weet dat ik Fiddler of Chrome ‘ s Developer Tools had kunnen gebruiken om hetzelfde te doen. Ik heb besloten om te gebruiken Gargl in plaats daarvan, omdat naast het laten u client/server verzoeken/reacties te bekijken, Gargl kunt u ook wijzigen en parametreren van deze verzoeken, en vervolgens automatisch genereert modules in een programmeertaal van uw keuze, zodat u deze dezelfde verzoeken kunt maken zonder het schrijven van een regel code. Daarover later meer.
hoe dan ook, nadat ik Gargl had verteld om te beginnen met opnemen en Trivia Crack te gaan gebruiken op Facebook in mijn browser, was de eerste stap om erachter te komen welke van de vele verzoeken die op deze Facebook pagina werden verzonden gerelateerd waren aan Trivia Crack, versus Facebook zelf. Inspecteren van de HTML op de pagina bleek dat de Trivia Crack inhoud is ingebed in Facebook via een iframe. Het element recht boven dit iframe was een formulier bedoeld om te posten naar een eigenaardige URL – https://preguntados.com/game.
te inspecteren mijn beperkte kennis van het Spaans herinnerde me eraan dat “pregunta” “vraag” betekent, wat gerelateerd lijkt aan trivia, dus ik vermoedde dat dit het domein was waar Trivia Crack wordt gehost. Door naar de URL https://preguntados.com/game te gaan, werd bevestigd dat verdenking:
de volgende stap was om te beginnen met het spelen van Trivia Crack, en terwijl ik speelde kijk naar de verzoeken die Gargl vindt dat de pagina maakt naar een url met “preguntados.com”:
terwijl ik Trivia Crack vragen beantwoordde, merkte ik dat er een nieuw verzoek leek te worden afgegeven voor elke vraag. Eigenlijk leek het verzoek te worden uitgegeven voordat ik zelfs” de spinner ” in Trivia Crack om te bepalen welke categorie de volgende vraag zou zijn:
dit deed me denken dat de vragen misschien vooraf bepaald waren, en de “random spinner” in feite was vooraf bepaald om op een bepaalde categorie te landen (en een bepaalde vraag te stellen) gebaseerd op het antwoord van de server op de “api.preguntados.com/api/users / <userID> / games / <gameID>” verzoek dat is verzonden voordat u op de knop “Spin” klikt. Voor mij betekende dit dat ik de gebruiker waarschijnlijk kon waarschuwen voor de vraag die ze op het punt staan van tevoren te worden gesteld, zodat ze zoveel tijd zouden hebben als ze wilden om erover na te denken of op te zoeken. Dit zou een voordeel zijn, want in Trivia Crack, krijg je slechts 30 seconden om een vraag te beantwoorden zodra de vraag wordt getoond, om te voorkomen dat de gebruiker antwoorden opzoekt. Bovendien, in sommige spelmodi zijn niet alleen het aantal vragen die je correct te krijgen, maar ook de hoeveelheid tijd die je nodig hebt om te beantwoorden, dat bepaalt of je wint. Als ik de gebruiker de vraag van tevoren kon laten zien, konden ze het duidelijk veel sneller beantwoorden zodra Trivia Crack zelf de vraag toont.
dus ik dacht dat ik een aanwijzing had en zocht in de details van dit verzoek. Het blijkt dat dit verzoek eigenlijk een veel grotere “cheater’ s advantage” dan ik dacht…
2 – de kwetsbaarheid in detail
met behulp van Gargl om te kijken naar de “api.preguntados.com / api / users / <userID> / games/<gameID>” request / response in detail kon ik bevestigen dat het inderdaad de te stellen vraag en de mogelijke antwoorden in het antwoord bevat. Ik was echter verbaasd dat het juiste antwoord op de vraag ook in het antwoord is ingebed!
zoals u hierboven kunt zien, bevat het antwoord op dit verzoek de vraag, de mogelijke antwoorden en welke index in de array van mogelijke antwoorden het juiste antwoord is. Dus als deze gegevens inderdaad over de volgende vraag gaan, nadat ik op “Spin” heb geklikt, moet mij worden gevraagd ” welke van de volgende Afrikaanse landen heeft geen kust?”en het juiste antwoord moet antwoorden van bovenaf zijn, dat is “ze doen het allemaal”. Klikken op “Spin” bewees deze hypothese correct:
ik gebruikte ook mijn browser om te vinden dat herhaalde GET requests naar ” api.preguntados.com / api / users / <userID> / games / <gameID>” geef altijd hetzelfde antwoord, totdat u de vraag die het geeft beantwoordt. Dit betekent dat ik deze URL kon aanvragen vanuit mijn eigen tool en nog steeds dezelfde vraag als de Trivia Crack client op Facebook zou ontvangen.
een antwoord dat het juiste antwoord bevat, wanneer het doel is dat de gebruiker het antwoord zelf moet bepalen, is in direct conflict met de “defensieve Programmeerpraktijk” van programmeren – in het bijzonder het “Vertrouw nooit de client” webprogrammeerprincipe. Aangezien de server geen controle heeft over hoe de client handelt, kan het niet aannemen dat de client niet op een kwaadaardige manier zal handelen, en dus zichzelf moet beschermen. De juiste manier om antwoord controle gedrag te implementeren is om het te doen op de server kant. Stuur op geen enkel moment het juiste antwoord naar de client, en zorg ervoor dat de client het antwoord van de gebruiker naar de server stuurt, waar de server het vervolgens controleert op juistheid en de gebruiker crediteert als het correct is (en natuurlijk slechts één antwoord per gebruiker per vraag toestaat).
echter, Trivia Crack deed dit niet, en in plaats daarvan vertrouwt de client. Nu was het gewoon een kwestie van het creëren van een kwaadaardige client om te profiteren van het feit dat het juiste antwoord wordt verzonden in de reactie. Idealiter, een die gemakkelijk zou zijn voor niet-technische gebruikers te installeren en te gebruiken. Hmm … hoe zit het met een Chrome-extensie die gewoon voegt een knop om de Trivia Crack spel, wanneer gespeeld op Facebook, dat wanneer geklikt beantwoordt de huidige vraag correct automatisch??
3 – gebruikmakend van de kwetsbaarheid
zoals ik hierboven al zei, kunt u met Gargl de verzoeken opnemen die u hebt laten opnemen, wijzigen en parametreren indien nodig, en vervolgens automatisch modules genereren in een programmeertaal van uw keuze om dezelfde verzoeken te doen. Ik ben niet van plan om te gaan in de details van dat proces, omdat je kunt kijken naar een van mijn Gargl blog posts om die info te vinden, maar in wezen heb ik gegenereerd een Gargl template bestand Voor Trivia Crack de verschillende API verzoeken, met behulp van de Gargl Chrome extensie, en vervolgens gebruikt een Gargl generator om te zetten dat template bestand in een Trivia Crack JavaScript-bibliotheek. Met behulp van Gargl voor dit stelde me in staat om een JavaScript-bibliotheek die praat met Trivia Crack servers te creëren, zonder het schrijven van een regel code om dit te doen, en ook een template bestand rond voor de toekomst in het geval dat Ik wil hetzelfde later doen voor een andere programmeertaal.
zodra ik deze Trivia Crack JavaScript-bibliotheek had, was het een eenvoudige kwestie van het bouwen van een Chrome-extensie in JavaScript die draait op het domein geladen in de Trivia Crack Facebook game page iframe (preguntados.com), voegt een knop aan de HTML voor het spel, en wanneer op die knop wordt geklikt vraagt de “api.preguntados.com / api / users / <userID> / games / <gameID>” URL, analyseert het antwoord voor het juiste antwoord en klikt vervolgens op de antwoordknop op de pagina die het juiste antwoord weergeeft.