Articles

Lär dig XSS med Googles XSS-spel

Steg för steg-instruktion om hur du löser Googles XSS-spel

Foto av Markus Spiske temporausch.com from Pexels

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

Du måste injicera xss-betalningsinnehållet i den virtuella webbläsaren. Du kan se källkoden genom att klicka på länken ”toggle”. Om du inte kan injicera kan du få tips genom att klicka på länken ”show”.

Vid kontroll av källkoden är det ett pythonskript och de 2 intressanta delarna i funktionen
def get(self) är

self.response.headers.add_header("X-XSS-Protection", "0")

och

query = self.request.get('query', '')
message = "Sorry, no results were found for <b>" + query + "</b>."
message += " <a href='?'>Try again</a>."

Den första delen kommer att stänga av chrome XSS-granskaren och göra det möjligt för oss att injicera xss-nyttolasten i webbläsaren.

Den andra delen visar att värdet av url-parametern query läggs direkt till i kroppen. Det är där vi måste exploatera.

Detta är enkelt och du kan försöka skriva in något av följande (och det finns ännu fler) i sökrutan och söka på det

<a href="javascript:alert()">Link</a>

<img src=X onerror="alert()">

<script>alert()</script>

Och så vidare. Om du använde den första måste du klicka på länken för att utföra varningen.

Snyggt!!! Du har framgångsrikt klarat av nivå 1. Nu ser du en knapp för att gå vidare till nästa nivå.

Den andra uppgiften: Uthållighet är nyckeln

I den här uppgiften måste du exekvera alert genom att lägga till ett inlägg. I det här spelet är det DOM XSS, men när det testas på riktiga chatt/kommentarsystem kommer det att vara ett lagrat XSS.

Okej, låt oss ta en titt på källan och det tidigare meddelandet också.

När du inspekterar källan kan du se att standardmeddelandet använder olika typer av html-taggar för att styla det. Det är vår nyckel.

Kontrollera källan för att bekräfta det. Så här återges vårt inlägg

Du kan se att inlägget inte passerar genom några filter. Så vi kan använda någon av de metoder som nämns ovan.

<a href="javascript:alert()">Link</a>

<img src=X onerror="alert()">

Och så vidare.

Grattis. Du har klarat av nivå 2. Nu går du vidare till nästa nivå.

Uppgift 3 : Den sjunkande känslan

Detta skiljer sig ganska mycket från de 2 som vi har klarat. Här måste vi lära oss om window.location.hash. Det är den del som kommer efter #-symbolen och används för navigering på sidan. Det är en webbläsarfunktion och fungerar även utan JavaScript.

Låt oss inspektera källkoden för den här.

Den intressanta delen i koden är

var html = "Image " + parseInt(num) + "<br>";
html += "<img src='https://medium.com/static/level3/cloud" + num + ".jpg' />";

num håller värdet av window.location.hash och används på 2 ställen. På det första stället används det inuti parseInt-funktionen, vilket innebär att vår payload inte kommer att fungera där. Men i nästa rad används rådata. Det är där vi ska injicera vår payload.

Så vi måste stänga en enda citationstecken ' där och vi måste injicera vår payload.

Du kan prova vilken payload som helst inne i ' ' Efter #

Va försöker sätta in någon av nedanstående efter # och besök url:n.

1' onerror='alert()

1'><img src=X onerror="alert()">'

1'><script>alert()</script>'

1'><a href="javascript:alert()">Link</a>'
Och så vidare.

Snyggt. Nu kan vi gå vidare till nästa nivå.

Uppgift 4 : Kontexten spelar roll

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.