Articles

Imparare XSS con il Gioco XSS di Google

Istruzioni passo passo su come risolvere il Gioco XSS di Google

Foto di Markus Spiske temporausch.com da Pexels

XSS aka Cross Site Scripting è una delle pericolose vulnerabilità lato client e uno dei metodi di caccia ai bug più amati.

Google XSS Game è una piattaforma di allenamento fornita da Google per praticare XSS. Consiste di 6 livelli e in ogni livello, devi eseguire un avviso JavaScript per passare al livello successivo. In ogni livello, ti verranno forniti diversi problemi e dovrai eseguire l’avviso utilizzando diverse tecniche in ogni livello. Questo ti aiuterà a capire i vari metodi che possono essere usati per eseguire XSS in una pagina web.

Allora iniziamo.

Passa a https://xss-game.appspot.com. Qui è dove è disponibile il Google XSS Game.

Vedrai una pagina come questa

Clicca il pulsante Let me at ‘em! per entrare nel gioco.

Primo compito: Ciao mondo di XSS

Devi iniettare il payload xss nel browser virtuale. Puoi visualizzare il codice sorgente cliccando sul link “toggle”. Se non riesci a iniettare, puoi ottenere i suggerimenti cliccando il link “mostra”.

Controllando il codice sorgente, è uno script python e le 2 parti interessanti nella funzione
def get(self) sono

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

e

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

La prima parte spegnerà il revisore XSS di chrome e ci permetterà di iniettare il payload XSS nel browser.

La seconda parte mostra che il valore del parametro url query viene aggiunto direttamente al corpo. È qui che dobbiamo sfruttare.

Questo è semplice e potete provare a inserire uno qualsiasi dei seguenti (e ce ne sono anche altri) nella casella di ricerca e cercarlo

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

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

<script>alert()</script>

E così via. Se hai usato il primo, devi cliccare sul Link per eseguire l’allarme.

Grande!!! Hai completato con successo il livello 1. Ora vedrai un pulsante per passare al livello successivo.

Secondo compito: La persistenza è la chiave

In questo compito, devi eseguire l’allarme aggiungendo un post. In questo gioco, è DOM XSS, ma quando si testa su applicazioni reali di chat/commenti, sarà un XSS memorizzato.

Ok diamo un’occhiata alla fonte e anche al messaggio precedente.

Quando si ispeziona la fonte, si può vedere che il messaggio di default usa diversi tipi di tag html per stilizzarlo. Questa è la nostra chiave.

Controlla il sorgente per confermarlo. Ecco come viene reso il nostro post

Puoi vedere che il post non passa attraverso nessun filtro. Quindi possiamo usare qualsiasi metodo menzionato sopra.

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

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

E così via.

Congratulazioni. Hai completato il livello 2. Ora passa al prossimo livello.

Task 3: Quella sensazione di sprofondamento

Questo è molto diverso dal 2 che abbiamo completato. Qui, dobbiamo imparare a conoscere window.location.hash. È la parte che viene dopo il simbolo # ed è usata per la navigazione nella pagina. È una caratteristica del browser e funzionerà anche senza JavaScript.

Ispezioniamo il codice sorgente per questo.

La parte interessante nel codice è

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

num tiene il valore di window.location.hash e viene usato in 2 posti. Al primo posto, è usato all’interno della funzione parseInt, quindi il nostro payload non funzionerà lì. Ma nella linea successiva, vengono usati i dati grezzi. È lì che inietteremo il nostro payload.

Quindi dobbiamo chiudere una singola citazione ' lì e dobbiamo iniettare il nostro payload.

Puoi provare qualsiasi payload dentro ' ' Dopo #

Prova a mettere uno qualsiasi dei seguenti dopo # e visita l’url.

1' onerror='alert()

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

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

1'><a href="javascript:alert()">Link</a>'
E così via.

Grande. Ora possiamo passare al livello successivo.

Task 4 : Context Matters

Abbiamo uno spazio per inserire la durata del timer. È lì che sfrutteremo.

Controlliamo il codice sorgente.

In timer.html, possiamo vedere questa linea

<img src="https://medium.com/static/loading.gif" onload="startTimer('{{ timer }}');" />

Dobbiamo sfruttare l’espressione {{ timer }} Ma è posta all’interno di una funzione startTimer(''); che è un gestore dell’evento onload. Il punto principale da notare è che l’attributo event handler in HTML accetta più funzioni di callback.

Quindi dobbiamo chiudere la funzione ed eseguire il nostro avviso lì. Notate che il valore non è passato attraverso una funzione parseInt, ma vengono utilizzati i dati grezzi. Quindi possiamo chiudere la funzione aggiungendo un '); e poi iniettare il nostro alert. Poiché è usato come inline, non possiamo iniettare alert(); lì perché romperà le cose. La dichiarazione diventerà onload="startTimer('3'); alert();')" e non funzionerà.

Perciò dobbiamo aggiungere un modello che mantenga il modello intatto.
Aggiungi alert(' ed è abbastanza.

Perciò il nostro payload sarà

3');alert('

Cliccando sul pulsante start timer verrà eseguito l’avviso e abbiamo finito questo livello.

Avanti al prossimo compito.

Task 5 : Breaking Protocol

Nella home page, non abbiamo modo di iniettare nulla. Abbiamo solo un link. Quindi clicchiamolo.

Qui, possiamo vedere 2 posti per iniettare il nostro payload. uno sull’url stesso e un altro sulla casella di input. La casella di input è un posto per inserire l’email e sperare che non si rifletta da qualche altra parte. Quindi andiamo nel primo. Sull’url.

Inseriamo il codice sorgente della pag corrente, cioè signup.html e possiamo vedere la linea

<a href="{{ next }}">Next >></a>

Posto ideale per iniettare un payload. Il nostro payload sarà impostato come il valore dell’attributo href in un tag a. Se siamo in grado di aggiungere javascript:alert() possiamo eseguire il nostro payload. Ora vediamo qual è il valore di next. Non ne troviamo nella pagina. Dove lo cerchiamo??

Codice Python in soccorso. Controllate level.py e vedremo

if "signup" in self.request.path:
self.render_template('signup.html',
{'next': self.request.get('next')})

Quindi il valore di next nell’url sarà usato.

Cambiate il valore di next nell’url da confirm a javascript:alert() e l’url finale sarà come

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 e all’interno del corpo della funzione, potete vedere il seguente codice.

var scriptEl = document.createElement('script');

Quindi possiamo caricare file js esterni ma non da un http o https url.

Ecco, proviamo gli url data.

Gli url sono nella forma data:{type},content

Quindi cambiate il valore dopo # in

data:application/javascript,alert()

o in

data:text/plain,alert() e possiamo eseguire il alert.

Ecco un video della risoluzione del gioco.