Joe Blog Levy

Update 2: Efter at have skrevet dette indlæg opdagede jeg også en anden sårbarhed i Trivia Crack, der tillod at give brugerne ubegrænsede liv/spins. På det tidspunkt tilføjede jeg dette som en anden funktion til Trivia Cracker. I går (1/29/2016) begyndte Trivia Cracker at forhindre denne funktion (automatisk besvarelse af spørgsmål fortsætter med at fungere — som beskrevet i dette indlæg). Men hvad der er sjovt er, ud over at forhindre det, kalder Trivia Crack-serveren mig også specifikt ud!

Trivia Crack error

Update 1: ved hjælp af lignende teknikker til nedenstående har jeg også udgivet en snyd Chrome-udvidelse til Candy Crush. Hent den her.

da feriesæsonen begyndte for et par uger siden, begyndte jeg at bemærke, at en ny app, Trivia Crack, blev populær hos mine venner. For dem af jer, der ikke ved, er Trivia Crack et nyt spil til Android, iPhone og Facebook. Forudsætningen for spillet er simpelt, og meget lig en anden populær app fra sidste år, Spørgsmål. I det væsentlige svarer du på trivia-spørgsmål i forskellige kategorier og konkurrerer mod dine venner om håneret. På trods af enkelheden (eller måske på grund af det) er Trivia Crack blevet meget populær som for sent at samle 5,3 millioner likes på Facebook og blive den bedste gratis app i Google Play (Android) Butik.

man skulle tro udviklerne af sådan en poleret og vellykket spil kunne have taget sig tid til at gennemføre det på en måde, der er sikker fra snyd, men det viser sig at skrive et program til at snyde på Trivia Crack er faktisk forholdsvis enkel. I løbet af en uge, jeg var i stand til at skrive og frigive en Chrome-udvidelse, Trivia Cracker, der vendte mig fra en medicore-at-best Trivia Crack-spiller til en tilsyneladende genial halvgud. Du kan se Trivia Cracker i aktion nedenfor:

så hvad er der galt med Trivia cracks implementering, der gjorde det muligt for mig så let at opbygge et værktøj, der lader nogen snyde? Kort sagt – når Trivia Crack-klientanmodninger fra Trivia Crack-serveren det næste spørgsmål at stille brugeren, serveren reagerer ikke kun med spørgsmålet og de mulige svar, men sender også hvilket svar der er det rigtige svar. Detaljerne om sårbarheden, hvordan jeg fandt den, og hvordan jeg byggede en Chrome-udvidelse for at drage fordel af den er nedenfor.

1 – Find sårbarheden

efter at have tabt til mine venner i Trivia Crack en for mange gange, besluttede jeg, at jeg ville se, om jeg kunne vinde på min egen, specielle måde. Selvom jeg ikke er så god til tilfældig trivia, er jeg ret god til reverse engineering. Jeg mistænkte, at jeg måske kunne drage fordel af at sende mine egne anmodninger til Trivia cracks servere eller bruge nogle data i svarene fra Trivia cracks servere for at få en fordel i spillet. Så jeg startede med at undersøge, hvilke slags data Trivia Crack-klienten og serveren passerer frem og tilbage.

for at inspicere disse data spillede jeg Trivia Crack i min bro.ser på Facebook, mens jeg optog og inspicerede de anmodninger og svar, der blev sendt mellem Trivia cracks klient og server ved hjælp af et værktøj, jeg tidligere havde oprettet kaldet Gargl. Ja, jeg ved, at jeg kunne have brugt Fiddler eller Chromes udviklerværktøjer til at gøre det samme. Jeg besluttede at bruge Gargl i stedet fordi ud over at lade dig se klient/server anmodninger/svar, Gargl lader dig også ændre og parameterisere disse anmodninger, og derefter automatisk genererer moduler i et programmeringssprog efter eget valg, så du kan gøre de samme anmodninger uden at skrive en linje kode. Mere om det senere.

efter at have fortalt Gargl at begynde at optage og gå til Trivia Crack på Facebook i min bro.ser, var det første skridt at finde ud af, hvilke af de mange anmodninger, der blev sendt på denne Facebook-side, der var relateret til Trivia Crack, versus Facebook selv. Inspektion af HTML på siden viste, at Trivia Crack-indholdet er indlejret i Facebook via en iframe. Elementet lige over denne iframe var en formular beregnet til at sende til en ejendommelig URL- https://preguntados.com/game.

brug af Chrome Dev-værktøjer til at inspicere Trivia cracks HTML

min begrænsede viden om spansk mindede mig om, at “pregunta” betyder “spørgsmål”, som synes relateret til trivia, så jeg mistænkte, at dette var domænet, hvor Trivia Crack er vært. Gå til https://preguntados.com/game URL bekræftet, at mistanke:

afspilning Trivia Crack på Preguntados.com

det næste skridt var bare at begynde at spille Trivia Crack, og som jeg spillede se på anmodningerne Gargl finder, at siden gør til enhver url indeholder “preguntados.com”:

brug af Gargl til at registrere handlinger i Trivia Crack

da jeg besvarede Trivia Crack-spørgsmål, bemærkede jeg, at en ny anmodning syntes at blive udstedt for hvert spørgsmål. Rent faktisk, anmodningen syntes at være udstedt, før jeg endda “spundet spinneren” i Trivia Crack for at bestemme, hvilken kategori det næste spørgsmål ville være:

 brug af Gargl til at optage handlinger i Trivia Crack

dette fik mig til at tro, at spørgsmålene måske var forudbestemt, og “tilfældig spinner” faktisk var forudbestemt til at lande på en bestemt kategori (og stille et bestemt spørgsmål) baseret på svaret fra serveren til “api.preguntados.com/api/users / <userID>/spil / < gameID>” anmodning, der sendes, før du klikker på knappen “Spin”. Til mig, dette betød, at jeg sandsynligvis kunne advare brugeren om det spørgsmål, de er ved at blive stillet på forhånd, så de ville have så meget tid, som de ville tænke over det eller slå det op. Dette ville være en fordel, fordi du i Trivia Crack kun får 30 sekunder til at besvare et spørgsmål, når spørgsmålet er vist, for at forhindre brugeren i at finde svar. Derudover er det i nogle spiltilstande ikke kun antallet af spørgsmål, du får korrekt, men også den tid, du tager at besvare, der bestemmer, om du vinder. Hvis jeg kunne vise brugeren spørgsmålet på forhånd, de kunne naturligvis besvare det meget hurtigere, når Trivia Crack selv viser spørgsmålet.

så jeg regnede med, at jeg havde en føring og gravede ind i detaljerne i denne anmodning. Det viser sig, at denne anmodning faktisk gav en meget større “snyderens fordel”, end jeg troede…

2 – sårbarheden i detaljer

ved hjælp af Gargl til at se på “api.preguntados.com / api / users / <userID>/games/< gameID> ” anmodning / svar i detaljer kunne jeg bekræfte, at det faktisk giver det spørgsmål, der skal stilles, samt de mulige svar i svaret. Jeg var dog overrasket over at finde ud af, at det rigtige svar på spørgsmålet også er indlejret i svaret!

brug af Gargl til at registrere handlinger i Trivia Crack - responssårbarheden

som du kan se ovenfor, indeholder svaret på denne anmodning spørgsmålet, de mulige svar, og hvilket indeks i rækken af mulige svar er det rigtige svar. Så hvis disse data faktisk handler om det næste spørgsmål, efter at jeg har klikket på “Spin”, skal jeg blive spurgt “hvilket af følgende afrikanske lande har ikke en kyst?”og det rigtige svar skal være svar ovenfra, hvilket er “alle gør”. Ved at klikke på “Spin” viste denne hypotese korrekt:

afspilning af Trivia Crack, før du vælger et svar

afspilning Trivia Crack, vælge det rigtige svar

jeg brugte også min bro.ser til at finde, at gentagne få anmodninger til “api.preguntados.com / api / users / <userID>/games/< gameID> ” giv altid det samme svar, indtil du besvarer det spørgsmål, det giver. Dette betyder, at jeg kunne anmode om denne URL fra mit eget værktøj og stadig modtage det samme spørgsmål som Trivia Crack-klienten på Facebook ville modtage.

et svar, der indeholder det rigtige svar, når målet er, at brugeren selv skal bestemme svaret, er i direkte konflikt med den “Defensive programmering” praksis med programmering – især “aldrig stole på klienten” – programmeringsprincippet. Da serveren ikke har kontrol over, hvordan klienten handler, kan den ikke antage, at klienten ikke vil handle på en ondsindet måde, og det skal også beskytte sig selv. Den korrekte måde at implementere svarkontrol adfærd på er at gøre det på serversiden. Send ikke det rigtige svar til klienten på noget tidspunkt, og lad klienten i stedet sende brugerens svar til serveren, hvor serveren derefter kontrollerer det for korrekthed og krediterer brugeren, hvis den er korrekt (og lad naturligvis kun et svar sendes pr.bruger pr. spørgsmål).

Imidlertid gjorde Trivia Crack ikke dette, og stoler i stedet på klienten. Nu var det bare et spørgsmål om at skabe en ondsindet klient for at drage fordel af det faktum, at det korrekte svar sendes i svaret. Ideelt set en, der ville være let for ikke-tekniske brugere at installere og bruge. Hmm … hvad med en Chrome-udvidelse, der bare tilføjer en knap til Trivia Crack-spillet, når det spilles på Facebook, at når det klikkes, svarer det aktuelle spørgsmål automatisk korrekt??

3 – drage fordel af sårbarheden

som jeg nævnte ovenfor, Gargl giver dig mulighed for at tage de anmodninger, du havde det optage, ændre og parameterisere dem efter behov, og derefter automatisk generere moduler i et programmeringssprog efter eget valg at gøre de samme anmodninger. Jeg vil ikke gå ind i detaljerne i denne proces, da du kan se på et af mine Gargl-blogindlæg for at finde den info, men i det væsentlige genererede jeg en Gargl-skabelonfil til Trivia cracks forskellige API-anmodninger ved hjælp af gargl Chrome-udvidelsen og brugte derefter en Gargl-generator til at omdanne den skabelonfil til et Trivia Crack JavaScript-bibliotek. Brug af Gargl til dette tillod mig at oprette et JavaScript-bibliotek, der taler til Trivia cracks servere, uden at skrive en kodelinje for at gøre det, og har også en skabelonfil rundt for fremtiden, hvis jeg vil gøre det samme senere for et andet programmeringssprog.

når jeg havde dette Trivia Crack JavaScript-bibliotek, var det et simpelt spørgsmål om at opbygge en Chrome-udvidelse i JavaScript, der kører på domænet indlæst i Trivia Crack Facebook-spilsiden iframe (preguntados.com), tilføjer en knap til HTML for spillet, og når der klikkes på knappen anmoder om “api.preguntados.com / api / users / <userID>/games/< gameID> ” URL, analyserer svaret for det rigtige svar, og klikker derefter på svarknappen på siden, der repræsenterer det rigtige svar.

 Trivia Cracker kører på Trivia Crack for at besvare spørgsmål til mig

Write a Comment

Din e-mailadresse vil ikke blive publiceret.