Articles

Učení XSS pomocí hry XSS společnosti Google

Návod krok za krokem, jak vyřešit hru XSS společnosti Google

Foto: Markus Spiske temporausch.com z Pexels

XSS alias Cross Site Scripting je jednou z nebezpečných zranitelností na straně klienta a jednou z nejoblíbenějších metod lovu chyb.

Google XSS Game je tréninková platforma poskytovaná společností google k procvičování XSS. Skládá se ze 6 úrovní a v každé úrovni musíte provést upozornění JavaScriptu, abyste postoupili do další úrovně. V každé úrovni budete mít k dispozici různé problémy a v každé úrovni musíte výstrahu provést pomocí různých technik. To vám pomůže pochopit různé metody, které lze použít k provedení XSS na webové stránce.

Takže začněme.

Přejděte na https://xss-game.appspot.com. Zde je k dispozici hra Google XSS.

Zobrazí se vám stránka jako tato

Klikněte na tlačítko Let me at ‚em! pro vstup do hry.

První úkol : Hello world of XSS

Musíte injektovat xss payload do virtuálního prohlížeče. Zdrojový kód si můžete prohlédnout kliknutím na odkaz „přepnout“. Pokud se vám nedaří injektovat, můžete získat nápovědu kliknutím na odkaz „zobrazit“.

Při prohlížení zdrojového kódu zjistíte, že se jedná o skript Python a 2 zajímavé části ve funkci
def get(self) jsou

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

a

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

První část vypne auditor XSS v Chromu a umožní nám injektovat payload XSS do prohlížeče.

Druhá část ukazuje, že hodnota url param query je přidána přímo do těla. To je místo, které musíme zneužít.

Je to jednoduché a můžete zkusit do vyhledávacího pole zadat některý z následujících údajů (a je jich tam ještě více) a vyhledat ho

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

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

<script>alert()</script>

A tak dále. Pokud jste použili první z nich, musíte kliknout na Odkaz, aby se výstraha provedla.

Skvělé!!! Úspěšně jste dokončili první úroveň. Nyní se zobrazí tlačítko pro přechod do další úrovně.

Druhý úkol : Vytrvalost je klíčová

V tomto úkolu musíte spustit alert přidáním příspěvku. V této hře se jedná o DOM XSS, ale při testování v reálných aplikacích pro chat/komentáře se bude jednat o uložený XSS.

Podívejme se na zdrojový kód a také na předchozí zprávu.

Při kontrole zdrojového kódu můžete vidět, že výchozí zpráva používá různé typy značek html pro stylování. To je náš klíč.

Podívejte se do zdrojového kódu, abyste to potvrdili. Takto je vykreslena naše zpráva

Vidíte, že zpráva neprochází žádnými filtry. Můžeme tedy použít některý z výše uvedených způsobů.

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

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

A tak dále.

Gratuluji. Dokončili jste druhou úroveň. Nyní postoupíte do další úrovně.

Úkol 3 : Ten pocit potopení

Tohle je klidně jiné než 2, kterou jsme dokončili. Zde se musíme seznámit s window.location.hash. Je to část přicházející za symbolem # a slouží k navigaci uvnitř stránky. Je to funkce prohlížeče a bude fungovat i bez JavaScriptu.

Podíváme se na zdrojový kód této části.

Zajímavá část v kódu je

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

num drží hodnotu window.location.hash a používá se na 2 místech. Na prvním místě se používá uvnitř funkce parseInt, tudíž tam náš payload nebude fungovat. Na dalším řádku se však použijí surová data. Tam budeme injektovat náš payload.

Takže tam musíme uzavřít jednu uvozovku ' a potřebujeme injektovat náš payload.

Můžete zkusit libovolný payload uvnitř ' ' Po #

Zkuste za # vložit některý z níže uvedených a navštívit url.

1' onerror='alert()

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

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

1'><a href="javascript:alert()">Link</a>'
A tak dále.

Skvělé. Nyní můžeme postoupit na další úroveň.

Úloha 4 : Na kontextu záleží

Máme prostor pro zadání doby trvání časovače. Toho využijeme.

Podíváme se do zdrojového kódu.

V souboru timer.html vidíme tento řádek

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

Musíme využít ve výrazu {{ timer }} Ten je ale umístěn uvnitř funkce startTimer('');, která je obsluhou události k události onload. Hlavně je třeba si uvědomit, že atribut obsluhy události v HTML přijímá více funkcí zpětného volání.

Takže musíme funkci uzavřít a provést v ní naše upozornění. Všimněte si, že, hodnota nebyla předána prostřednictvím funkce parseInt místo toho jsou použita surová data. Můžeme tedy funkci uzavřít přidáním '); a pak do ní vložit náš alert. Protože je použita jako inline, nemůžeme tam injektovat alert();, protože by se to rozbilo. Z příkazu se stane onload="startTimer('3'); alert();')" a nebude to fungovat.

Takže musíme přidat vzor, který udrží vzor neporušený.
Přidáme alert(' a to stačí.

Takže náš payload bude

3');alert('

Kliknutím na tlačítko start timer se spustí upozornění a tím jsme tuto úroveň dokončili.

Přejděte na další úlohu.

Úloha 5 : Prolomení protokolu

Na úvodní stránce nemáme možnost nic injektovat. Máme pouze odkaz. Takže na něj klikneme.

Tady vidíme 2 místa, kam můžeme injektovat náš payload. jedno na samotnou url adresu a druhé na vstupní pole. Vstupní pole je místem pro zadání e-mailu a doufáme, že se neprojeví někde jinde. Přejděme tedy k prvnímu z nich. Na url.

Prohlédněte si zdrojový kód aktuální stránky, tedy signup.html, a uvidíme řádek

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

Skvělé místo pro injektování payloadu. Naše užitečné zatížení bude nastaveno jako hodnota atributu href v tagu a. Pokud se nám podaří přidat javascript:alert(), můžeme náš payload spustit. Nyní se podíváme, jaká je hodnota atributu next. Ve stránce žádnou nenajdeme. Kde ji máme hledat?

Kód Pythonu na pomoc. Podívejte se do souboru level.py a uvidíme

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

Takže se použije hodnota next v url.

Změňte hodnotu next v url z confirm na javascript:alert() a výsledná url bude vypadat takto

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 a uvnitř těla funkce uvidíte následující kód.

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

Takže můžeme načíst externí js soubor, ale ne z url http nebo https.

Zkusíme tedy data url.

Data url jsou ve tvaru data:{type},content

Změníme tedy hodnotu za # na

data:application/javascript,alert()

nebo na

data:text/plain,alert() a můžeme spustit alert.

Tady je video s řešením hry.

.