Joe Blog Levy

Uppdatering 2: Efter att ha skrivit det här inlägget upptäckte jag också en annan sårbarhet i Trivia Crack som möjliggjorde att ge användarna obegränsade liv/snurr. Vid den tiden lade jag till detta som en annan funktion till Trivia Cracker. Igår (1/29/2016) började Trivia Cracker förhindra den här funktionen (Automatisk svar på frågor fortsätter att fungera — som beskrivs i det här inlägget). Men det som är roligt är, förutom att förhindra det, Trivia Crack-servern kallar mig också specifikt!

Trivia Crack error

uppdatering 1: med liknande tekniker som nedan har jag också släppt en fusk Chrome-förlängning för Candy Crush. Hämta det här.

när semesterperioden började för några veckor sedan började jag märka att en ny app, Trivia Crack, blev populär bland mina vänner. För er som inte vet är Trivia Crack ett nytt spel för Android, iPhone och Facebook. Utgångspunkten för spelet är enkel, och mycket lik en annan populär app från förra året, QuizUp. I huvudsak svarar du på triviafrågor i olika kategorier och tävlar mot dina vänner för att skryta. Trots enkelheten (eller kanske på grund av det), Trivia Crack har blivit mycket populär som för sent – omdragning upp 5,3 miljoner gillar på Facebook och bli den bästa gratis app i Google Play (Android) butik.

du skulle tro att utvecklarna av ett sådant polerat och framgångsrikt spel kan ha tagit sig tid att implementera det på ett sätt som är säkert från fusk, men det visar sig att skriva ett program för att fuska på Trivia Crack är faktiskt ganska enkelt. Under en helg kunde jag skriva och släppa en Chrome-förlängning, Trivia Cracker, som gjorde mig från en medicore-at-best Trivia Crack-spelare till en till synes genial demigod. Du kan se Trivia Cracker i aktion nedan:

så vad är fel med Trivia cracks implementering som gjorde det möjligt för mig att så enkelt bygga ett verktyg som låter någon fuska? Kort sagt-när Trivia Crack-klienten begär från Trivia Crack-servern nästa fråga att ställa Användaren, svarar servern inte bara med frågan och de möjliga svaren, utan skickar också vilket svar som är rätt svar. Detaljerna om sårbarheten, hur jag hittade den och hur jag byggde ett Chrome-tillägg för att dra nytta av det finns nedan.

1 – hitta sårbarheten

efter att ha förlorat till mina vänner i Trivia Crack en för många gånger bestämde jag mig för att se om jag kunde vinna på mitt eget speciella sätt. Även om jag inte är så bra på slumpmässiga trivia, jag är ganska bra på reverse-engineering. Jag misstänkte att jag skulle kunna dra nytta av att skicka mina egna förfrågningar till Trivia cracks servrar, eller använda vissa data i svaren från Trivia cracks servrar, för att få en fördel i spelet. Så jag började med att undersöka vilka typer av data Trivia Crack-klienten och servern passerar fram och tillbaka.

för att inspektera dessa data spelade jag Trivia Crack i min webbläsare på Facebook, medan jag spelade in och inspekterade förfrågningar och svar som skickades mellan Trivia cracks klient och server med ett verktyg som jag hade skapat tidigare kallat Gargl. Ja, jag vet att jag kunde ha använt Fiddler eller Chromes utvecklarverktyg för att göra detsamma. Jag bestämde mig för att använda Gargl istället för att förutom att låta dig se klient/serverförfrågningar/svar, låter Gargl dig också ändra och parametrisera dessa förfrågningar och sedan automatiskt generera moduler i ett programmeringsspråk efter eget val så att du kan göra samma förfrågningar utan att skriva en kodrad. Mer om det senare.

hur som helst, efter att ha sagt Gargl att börja spela in och gå till Trivia Crack på Facebook i min webbläsare, var det första steget att ta reda på vilka av de många förfrågningar som skickades på denna Facebook-sida var relaterade till Trivia Crack, kontra Facebook själv. Inspektion av HTML på sidan visade att Trivia Crack-innehållet är inbäddat i Facebook via en iframe. Elementet precis ovanför denna iframe var en form som var avsedd att posta till en märklig URL- https://preguntados.com/game.

använda Chrome Dev Tools för att inspektera Trivia cracks HTML

min begränsade kunskap om spanska påminde mig om att ”pregunta” betyder ”fråga”, vilket verkar relaterat till trivia, så jag misstänkte att detta var domänen där Trivia Crack är värd. Att gå till https://preguntados.com/game URL bekräftade den misstanken:

spelar Trivia spricka på Preguntados.com

nästa steg var bara att börja spela Trivia Crack, och när jag spelade titta på förfrågningarna Gargl finner att sidan gör till någon url som innehåller ”preguntados.com”:

använda Gargl för att spela in åtgärder i Trivia Crack

när jag svarade på Trivia Crack-frågor märkte jag att en ny begäran tycktes utfärdas för varje fråga. Faktiskt, begäran tycktes utfärdas innan jag ens ”snurrade spinnaren” i Trivia Crack för att avgöra vilken kategori nästa fråga skulle vara:

 använda Gargl för att spela in åtgärder i Trivia Crack

detta fick mig att tänka kanske frågorna var förutbestämda, och” random spinner ”i själva verket var förutbestämd att landa på en viss kategori (och ställa en viss fråga) baserat på svaret från servern till” random spinner api.preguntados.com/api/users / <userID>/spel / < gameID> ” begär att skickas innan du klickar på ”Spin” – knappen. För mig innebar det att jag förmodligen kunde varna användaren på frågan de ska bli frågade i förväg, så de skulle ha så mycket tid som de ville tänka på det eller slå upp det. Detta skulle vara en fördel eftersom Trivia Crack, du bara får 30 sekunder för att svara på en fråga när frågan visas, för att hindra användaren från att leta upp svar. Dessutom, i vissa spellägen är det inte bara antalet frågor du får rätt, men också hur lång tid du tar för att svara, som avgör om du vinner. Om jag kunde visa användaren frågan i förväg, kunde de uppenbarligen svara på det mycket snabbare när Trivia Crack själv visar frågan.

så jag tänkte att jag hade en ledning och grävde in i detaljerna i denna begäran. Det visar sig att denna begäran faktiskt gav en mycket större ”fuskarens fördel” än jag trodde…

2 – sårbarheten i detalj

med Gargl för att titta på ”api.preguntados.com/api/users/<userID>/games/<gameID>” begäran / svar i detalj kunde jag bekräfta att det verkligen ger frågan som ska ställas, liksom de möjliga svaren, i svaret. Jag blev dock förvånad över att finna att det rätta svaret på frågan också är inbäddat i svaret!

använda Gargl för att spela in åtgärder i Trivia Crack - svarssårbarheten

som du kan se ovan innehåller svaret på denna begäran frågan, de möjliga svaren och vilket index i uppsättningen möjliga svar är det rätta svaret. Så om dessa uppgifter verkligen handlar om nästa fråga, efter att jag klickat på ”Spin”, borde jag bli frågad ”vilket av följande afrikanska länder har ingen kust?”och det rätta svaret ska vara svar från ovan, vilket är ”alla gör det”. Att klicka på ”Spin” visade att denna hypotes var korrekt:

spela Trivia Crack, innan du väljer ett svar

spelar Trivia spricka, välja rätt svar

jag använde också min webbläsare för att finna att upprepade få förfrågningar till ”api.preguntados.com / api / users / <userID>/games/<gameID>” ge alltid samma svar tills du svarar på frågan den ger. Det betyder att jag kunde begära denna URL från mitt eget verktyg och fortfarande få samma fråga som Trivia Crack-klienten på Facebook skulle få.

ett svar som innehåller rätt svar, när målet är att användaren måste bestämma svaret själva, står i direkt konflikt med programmeringspraxis ”defensiv programmering” – särskilt principen ”lita aldrig på klienten” webbprogrammering. Eftersom servern inte har någon kontroll över hur klienten agerar, kan den inte anta att klienten inte kommer att agera på ett skadligt sätt, och så måste skydda sig själv. Det korrekta sättet att implementera svarskontrollbeteende är att göra det på serversidan. Skicka inte rätt svar till klienten när som helst, och låt istället klienten skicka användarens svar till servern, där servern sedan kontrollerar det för korrekthet och krediterar användaren om det är korrekt (och naturligtvis tillåter bara ett svar att skickas per användare per fråga).

Trivia Crack gjorde dock inte detta och litar istället på klienten. Nu handlade det bara om att skapa en skadlig klient för att dra nytta av det faktum att rätt svar skickas i svaret. Helst en som skulle vara lätt för icke-tekniska användare att installera och använda. Hmm…vad sägs om en Chrome-förlängning som bara lägger till en knapp i Trivia Crack-spelet, när det spelas på Facebook, som när den klickas svarar den aktuella frågan korrekt automatiskt??

3 – utnyttja sårbarheten

som jag nämnde ovan låter Gargl dig ta de förfrågningar du hade det spela in, ändra och parametrisera dem efter behov och sedan automatiskt generera moduler i ett programmeringsspråk efter eget val för att göra samma förfrågningar. Jag kommer inte att gå in på detaljerna i den processen eftersom du kan titta på ett av mina Gargl-blogginlägg för att hitta den informationen, men i huvudsak genererade jag en Gargl-mallfil för Trivia cracks olika API-förfrågningar, med gargl Chrome-tillägget och använde sedan en Gargl-generator för att göra den mallfilen till ett Trivia Crack JavaScript-bibliotek. Att använda Gargl för detta gjorde det möjligt för mig att skapa ett JavaScript-bibliotek som pratar med Trivia cracks servrar, utan att skriva en kodrad för att göra det och också ha en mallfil runt för framtiden om jag vill göra samma sak senare för ett annat programmeringsspråk.

när jag hade detta Trivia Crack JavaScript-bibliotek var det en enkel fråga om att bygga en Chrome-förlängning i JavaScript som körs på domänen laddad i Trivia Crack Facebook – spelsidan iframe (preguntados.com), lägger till en knapp i HTML för spelet, och när den knappen klickas begär ”api.preguntados.com/api/users/<userID>/games / <gameID>” URL, tolkar svaret för rätt svar och klickar sedan på svarsknappen på sidan som representerar rätt svar.

 Trivia Cracker körs på Trivia spricka för att svara på frågor för mig

Write a Comment

Din e-postadress kommer inte publiceras.