Lär dig XSS med Googles XSS-spel
Steg för steg-instruktion om hur du löser Googles XSS-spel
XSS aka Cross Site Scripting är en av de farliga sårbarheterna på klientsidan och en av de mest omtyckta metoderna för feljakt.
Google XSS Game är en utbildningsplattform som tillhandahålls av Google för att öva XSS. Den består av sex nivåer och i varje nivå måste du utföra en JavaScript-varning för att kunna gå vidare till nästa nivå. I varje nivå får du olika problem och du måste utföra varningen med hjälp av olika tekniker i varje nivå. Detta kommer att hjälpa dig att förstå olika metoder som kan användas för att utföra XSS på en webbsida.
Så låt oss börja.
Navigera till https://xss-game.appspot.com. Här finns Google XSS Game tillgängligt.
Du kommer att se en sida som denna
Klicka på knappen Let me at ’em! för att komma in i spelet.
Första uppgiften: Hello world of XSS
Vi har ett utrymme där vi kan ange timerns längd. Det är där vi ska utnyttja.
Låt oss kolla källkoden.
I timer.html kan vi se den här raden
<img src="https://medium.com/static/loading.gif" onload="startTimer('{{ timer }}');" />
Vi måste utnyttja i uttrycket {{ timer }}
Men det är placerat inne i en funktion startTimer('');
som är en händelsehanterare till onload
händelsen. Det viktigaste att notera är att attributet händelsehanterare i HTML accepterar flera callback-funktioner.
Så vi måste stänga funktionen och exekvera vår varning där. Observera att värdet inte har överförts via en parseInt
-funktion utan att rådata används. Så vi kan stänga funktionen genom att lägga till en ');
och sedan injicera vår alert
. Eftersom den används som inline kan vi inte injicera alert();
där eftersom det kommer att bryta saker och ting. Uttalandet kommer att bli onload="startTimer('3'); alert();')"
och det kommer inte att fungera.
Så vi måste lägga till ett mönster som håller mönstret obrutet.
Lägg till alert('
och det räcker.
Så vår payload kommer att vara
3');alert('
Klickar vi på start timer-knappen kommer varningen att exekveras och vi har avslutat denna nivå.
Gå vidare till nästa uppgift.
Uppgift 5 : Breaking Protocol
På hemsidan har vi inget sätt att injicera något. Allt vi har är en länk. Så låt oss klicka på den.
Här kan vi se 2 platser för att injicera vår payload. en på själva url:en och en annan på inmatningsrutan. Inmatningsrutan är en plats för att skriva in e-post och hoppas att den inte reflekteras någon annanstans. Så låt oss gå till den första. På url:n.
Inspektera källkoden för aktuell pag, det vill säga signup.html och vi kan se linjen
<a href="{{ next }}">Next >></a>
En utmärkt plats för att injicera en payload. Vår payload kommer att sättas som värdet av href
-attributet i en a
-tagg. Om vi kan lägga till javascript:alert()
kan vi exekvera vår payload. Nu ska vi se vad som är värdet på next
. Vi kan inte hitta något på sidan. Var letar vi efter det???
Pythonkod till undsättning. Kolla level.py och vi kommer att se
if "signup" in self.request.path:
self.render_template('signup.html',
{'next': self.request.get('next')})
Så värdet av next
i url:en kommer att användas.
Ändra värdet på next
i url:en från confirm
till javascript:alert()
och den slutliga url:en kommer att se ut som
Now clicking on Next >> in the page will trigger our payload.
We now completed level 5. And 1 level remains.
Task 6 : Follow the 🐇
There is a path to a js file in the url.
Let’s inspect the source code. In page index.html, you can see a function includeGadget
och inuti funktionskroppen kan du se följande kod:
var scriptEl = document.createElement('script');
Så vi kan läsa in en extern js-fil, men inte från en http
eller https
url.
Här kan vi prova data
url:er.
Dataurl:er är i formen data:{type},content
Så ändra värdet efter #
till
data:application/javascript,alert()
eller till
data:text/plain,alert()
och vi kan exekvera alert
.
Här är en video om hur vi löser spelet.