Articles

Învățarea XSS cu Google’s XSS Game

Instrucțiuni pas cu pas despre cum se rezolvă Google’s XSS Game

Fotografie de Markus Spiske temporausch.com from Pexels

XSS aka Cross Site Scripting este una dintre vulnerabilitățile periculoase pe partea clientului și una dintre cele mai apreciate metode de vânătoare de erori.

Google XSS Game este o platformă de antrenament oferită de google pentru a practica XSS. Constă din 6 niveluri și în fiecare nivel trebuie să executați o alertă JavaScript pentru a trece la nivelul următor. În fiecare nivel, vi se vor pune la dispoziție diferite probleme și trebuie să executați alerta folosind tehnici diferite în fiecare nivel. Acest lucru vă va ajuta să înțelegeți diferite metode care pot fi folosite pentru a executa XSS într-o pagină web.

Așa că haideți să începem.

Navigați la https://xss-game.appspot.com. Aici este disponibil jocul Google XSS Game.

Vă veți vedea o pagină ca aceasta

Click pe butonul Let me at ‘em! pentru a intra în joc.

Prima sarcină : Hello world of XSS

Trebuie să injectați payload-ul xss în browserul virtual. Puteți vizualiza codul sursă făcând clic pe link-ul „toggle”. Dacă nu reușiți să injectați, puteți obține indicii făcând clic pe linkul „show”.

În timp ce verificați codul sursă, acesta este un script python și cele 2 părți interesante din funcția
def get(self) sunt

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

și

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

Prima parte va dezactiva auditorul XSS de la Chrome și ne va permite să injectăm sarcina utilă XSS în browser.

A doua parte arată că valoarea parametrului url query este adăugată direct în corp. Aici trebuie să exploatăm.

Aceasta este una simplă și puteți încerca să introduceți oricare dintre următoarele (și chiar mai multe sunt acolo) în caseta de căutare și să o căutați

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

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

<script>alert()</script>

Și așa mai departe. Dacă l-ați folosit pe primul, trebuie să dați click pe Link pentru a executa alerta.

Genial!!! Ați terminat cu succes nivelul 1. Acum veți vedea un buton pentru a trece la nivelul următor.

A doua sarcină : Persistența este cheia

În această sarcină, trebuie să executați alerta prin adăugarea unui mesaj. În acest joc, este vorba de DOM XSS, dar atunci când se testează pe aplicații reale de chat/comentarii, va fi un XSS stocat.

Ok, haideți să ne uităm la sursă și la mesajul anterior, de asemenea.

Când inspectați sursa, puteți vedea că mesajul implicit folosește diferite tipuri de etichete html pentru a-l stiliza. Aceasta este cheia noastră.

Controlați sursa pentru a confirma acest lucru. Acesta este modul în care este redat mesajul nostru

Vezi că mesajul nu trece prin niciun filtru. Așa că putem folosi oricare dintre metodele menționate mai sus.

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

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

Și așa mai departe.

Congrats. Ați terminat nivelul 2. Acum treceți la nivelul următor.

Tara 3 : Acel sentiment de scufundare

Aceasta este liniștit diferită de cele 2 pe care le-am terminat. Aici, trebuie să învățăm despre window.location.hash. Este partea care vine după simbolul # și este folosită pentru navigarea în pagină. Este o caracteristică a browserului și va funcționa chiar și fără JavaScript.

Să inspectăm codul sursă pentru acesta.

Partea interesantă din cod este

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

num deține valoarea lui window.location.hash și este folosită în 2 locuri. În primul rând, este utilizată în interiorul funcției parseInt, prin urmare, sarcina noastră utilă nu va funcționa acolo. Dar în linia următoare, sunt utilizate datele brute. Acolo vom injecta sarcina noastră utilă.

Așa că trebuie să închidem un singur quot ' acolo și trebuie să injectăm sarcina noastră utilă.

Puteți încerca orice sarcină utilă în interiorul ' ' După #

Încercați să puneți oricare dintre cele de mai jos după # și să vizitați url-ul.

1' onerror='alert()

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

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

1'><a href="javascript:alert()">Link</a>'
Și așa mai departe.

Genial. Acum putem trece la nivelul următor.

Tașa 4 : Context Matters

Avem un spațiu pentru a introduce durata temporizatorului. Acolo vom exploata.

Să verificăm codul sursă.

În timer.html, putem vedea această linie

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

Trebuie să exploatăm în expresia {{ timer }}Dar aceasta este plasată în interiorul unei funcții startTimer(''); care este un gestionar de eveniment pentru evenimentul onload. Principalul punct de reținut este că atributul event handler din HTML acceptă mai multe funcții de callback.

Așa că trebuie să închidem funcția și să executăm alerta noastră acolo. Rețineți că, valoarea nu a fost trecută printr-o funcție parseInt în schimb sunt folosite datele brute. Așadar, putem închide funcția prin adăugarea unui '); și apoi să ne injectăm alert. Din moment ce este folosit ca inline, nu putem injecta alert(); acolo, deoarece va strica lucrurile. Instrucțiunea va deveni onload="startTimer('3'); alert();')" și nu va funcționa.

Așa că trebuie să adăugăm un model care să păstreze modelul neîntrerupt.
Adaugați alert(' și este suficient.

Așa că sarcina noastră utilă va fi

3');alert('

Clicul pe butonul de pornire a cronometrului va executa alerta și am terminat acest nivel.

Avansați la următoarea sarcină.

Task 5 : Breaking Protocol

În pagina principală, nu avem o modalitate de a injecta nimic. Tot ce avem este un link. Așa că haideți să dăm clic pe el.

Aici, putem vedea 2 locuri pentru a ne injecta sarcina utilă. unul pe url-ul propriu-zis și altul pe caseta de intrare. Căsuța de intrare este un loc în care introducem e-mailul și sperăm că nu se va reflecta în altă parte. Deci, să mergem la primul. Pe url.

Inspectați codul sursă al paginii curente, adică signup.html și putem vedea linia

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

Un loc excelent pentru a injecta o sarcină utilă. Sarcina noastră utilă va fi setată ca valoare a atributului href într-un tag a. Dacă reușim să adăugăm javascript:alert(), putem executa sarcina noastră utilă. Acum haideți să vedem care este valoarea lui next. Nu putem găsi niciuna în pagină. Unde o căutăm???

Codul Python vine în ajutor. Verificați level.py și vom vedea

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

Așa că valoarea lui next din url va fi folosită.

Schimbați valoarea lui next din url de la confirm la javascript:alert() și url-ul final va arăta ca

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 și în interiorul corpului funcției, puteți vedea următorul cod.

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

Așa că putem încărca un fișier js extern, dar nu de la un url http sau https.

Aici, să încercăm urile data.

Datele urilor sunt sub forma data:{type},content

Așa că schimbați valoarea după # în

data:application/javascript,alert()

sau în

data:text/plain,alert() și putem executa alert.

Iată un video de rezolvare a jocului.

.