XSS
-
Cross Site Scripting (XSS) je zranitelnost webových aplikací, která umožňuje útočníkovi vložit škodlivý JavaScript kód do webové stránky zobrazované ostatním uživatelům.
-
Tento kód se následně spustí v prohlížeči oběti, což může vést ke krádeži cookies, session tokenů, přesměrování uživatele na škodlivé stránky nebo manipulaci s obsahem stránky.
-
XSS se vyskytuje v situacích, kdy webová aplikace nesanitizuje uživatelský vstup pořádně.
-
Nejčastěji se používá testovací payload
<script>alert('XSS!')</script>, který zobrazí jednoduché upozornění, ale útočníci mohou použít mnohem sofistikovanější kód pro různé škodlivé účely.
Alternativy k <script>
- Existují i jiné způsoby, jak spustit škodlivý JavaScript kód bez použití
<script>tagu, například pomocí atributůonerrorneboonclickv HTML elementech. Například:
<img src=# onerror="alert('XSS!')">
- Toto má několik výhod oproti tradičnímu
<script>tagu, protože některé filtry mohou být navrženy tak, aby blokovaly pouze<script>tagy, ale ne jiné způsoby spouštění JavaScriptu. - Dále také
<skript>tag může být umístěn pouze v určitých částech HTML dokumentu, zatímco<img>sonerrormůže být umístěn téměř kdekoli, což zvyšuje pravděpodobnost úspěchu útoku.
Obecný příklad útoku
- Nechť je webová aplikace, kde si uživatelé mohou ukládat cítaty a ostatní uživatelé je mohou vidět:
<h2>Citáty</h2>
<ul>
<li>Život je krásný.</li>
<li>Každý den je nový začátek.</li>
<li>Nezáleží na tom, jak pomalu jdeš, dokud nezastavíš.</li>
<li>Štěstí přeje připraveným.</li>
<li>I malý krok vpřed je stále krokem k cíli.</li>
<li>Největší překážky jsou často jen v naší hlavě.</li>
<li>Kdo chce, hledá způsoby. Kdo nechce, hledá důvody.</li>
<li>Úspěch je součet malých snah opakovaných každý den.</li>
<li>Nikdy není pozdě začít znovu.</li>
<li>Sny se stanou skutečností, když pro ně něco uděláš.</li>
</ul>
Citáty provided by ChatGPT
Pokud webová aplikace umožňuje uživatelům přidávat své vlastní citáty bez řádné sanitizace, útočník může vložit škodlivý JavaScript kód místo citátu a stránka bude vypadat například takto:
<h2>Citáty</h2>
<ul>
<li>Život je krásný.</li>
<li>Každý den je nový začátek.</li>
<li>Nezáleží na tom, jak pomalu jdeš, dokud nezastavíš.</li>
<li>Štěstí přeje připraveným.</li>
<li>I malý krok vpřed je stále krokem k cíli.</li>
<li>Největší překážky jsou často jen v naší hlavě.</li>
<li>Kdo chce, hledá způsoby. Kdo nechce, hledá důvody.</li>
<li>Úspěch je součet malých snah opakovaných každý den.</li>
<li>Nikdy není pozdě začít znovu.</li>
<li>Sny se stanou skutečností, když pro ně něco uděláš.</li>
<li><img src=# onerror=alert('XSS!')></li>
</ul>
Ukázka
- Takto to bude vypadat v praxi:
Citáty
- Život je krásný.
- Každý den je nový začátek.
- Nezáleží na tom, jak pomalu jdeš, dokud nezastavíš.
- Štěstí přeje připraveným.
- I malý krok vpřed je stále krokem k cíli.
- Největší překážky jsou často jen v naší hlavě.
- Kdo chce, hledá způsoby. Kdo nechce, hledá důvody.
- Úspěch je součet malých snah opakovaných každý den.
- Nikdy není pozdě začít znovu.
- Sny se stanou skutečností, když pro ně něco uděláš.
- V tomto příkladu, když uživatel zadá škodlivý kód do vstupního pole a klikne na tlačítko “Přidat citát”, nový citát se přidá do seznamu a škodlivý JavaScript kód se spustí, což zobrazí upozornění “XSS!”.
- Pokud by jsme v tomto místě použili
<script>alert('XSS')</script>tag, nefungovalo by to. To protože<script>není umístěn na správném místě v HTML dokumentu.
Druhy XSS
- Existují tři hlavní druhy XSS útoků:
Stored
- Útočník vloží škodlivý kód do databáze nebo jiného úložiště na serveru, a tento kód se pak zobrazuje všem uživatelům, kteří navštíví infikovanou stránku.
- Je to nejzávažnější typ XSS útoku, protože škodlivý kód je uložen na serveru a může být zobrazen mnoha uživatelům.
- Například, pokud útočník vloží škodlivý JavaScript kód do komentáře na blogu, tento kód se zobrazí všem návštěvníkům, kteří si tento komentář přečtou.
Reflected
- Útočník vloží škodlivý kód do URL nebo formuláře, a tento kód se pak odrazí zpět uživateli v odpovědi serveru.
- Tento typ XSS útoku je méně závažný než stored XSS, protože škodlivý kód není uložen na serveru a je zobrazen pouze uživateli, který klikne na škodlivý odkaz nebo odešle škodlivý formulář.
- Například útočník může vytvořit škodlivý odkaz, který obsahuje škodlivý JavaScript kód, a když uživatel klikne na tento odkaz, kód se spustí v jeho prohlížeči
https://example.com/search?q=<script>alert('XSS!')</script>
DOM-based
- DOM XSS se vyznačuje tím, že škodlivý kód je zpracováván pouze na straně klienta (v prohlížeči) a není odesílán na server.
- Útočník vloží škodlivý kód do URL nebo formuláře, a tento kód se pak zpracovává JavaScriptem na straně klienta, což může vést ke spuštění škodlivého kódu v prohlížeči oběti.
- XSS není DOM based, pokud se nevyužívá JavaScript pro zpracování škodlivého kódu na straně klienta.
- Tento typ XSS útoku je nejméně závažný, protože škodlivý kód není zpracováván serverem a je zobrazen pouze uživateli, který klikne na škodlivý odkaz nebo odešle škodlivý formulář.
- Například útočník může vytvořit škodlivý odkaz, který obsahuje škodlivý JavaScript kód, a když uživatel klikne na tento odkaz, kód se zpracuje v jeho prohlížeči a může vést ke spuštění škodlivého kódu.
https://example.com/page#<script>alert('XSS!')</script>
Následky XSS
- Odcizení cookies a session tokenů, což může vést k převzetí účtu oběti.
- Přesměrování uživatele na škodlivé stránky, které mohou obsahovat malware nebo phishingové útoky.
- Měnání obsahu stránky, což může být použito k šíření dezinformací nebo k manipulaci s uživateli.
Ochrana proti XSS
- Pro ochranu proti XSS útokům je důležité správně validovat a sanitizovat uživatelský vstup, používát knihovny pro escapování.
- Používání Content Security Policy (CSP) může pomoci omezit možnosti spouštění škodlivého JavaScript kódu na webové stránce.
- Pravidelně aktualizovat software a používat bezpečnostní záplaty pro webové servery a frameworky, které mohou obsahovat opravy pro známé XSS zranitelnosti.
Nástroje
Nástroje, které pomáhají při testování proti XSS útokům, zahrnují:
- Burp Suite: Populární nástroj pro testování bezpečnosti webových aplikací, který obsahuje funkce pro detekci a exploitaci XSS zranitelností.
- ZAP: Open-source nástroj pro testování bezpečnosti webových aplikací, který také nabízí možnosti pro detekci XSS zranitelností.
- XSStrike: Nástroj pro detekci a exploitaci XSS zranitelností, který se zaměřuje na různé techniky útoků a obchází běžné filtry.
Shrnutí
- XSS je zranitelnost webových aplikací, která umožňuje útočníkovi vložit škodlivý JavaScript kód do webové stránky zobrazované ostatním uživatelům.
- Jedná se o typ útoku způsobený nedostatečnou sanitizací uživatelského vstupu.
- Může vést ke krádeži cookies, session tokenů, přesměrování uživatele na škodlivé stránky nebo manipulaci s obsahem stránky.
- Pro ochranu proti XSS útokům je důležité správně validovat a sanitizovat uživatelský vstup, používat knihovny pro escapování a implementovat Content Security Policy (CSP).
Reference
- https://owasp.org/www-community/attacks/xss/
- https://portswigger.net/web-security/cross-site-scripting