4.1 Cross Site Scripting (XSS)
Cross Site Scripting (XSS) je zranitelnost, která útočníkovi umožňuje spustit škodlivý klientský skript (např. JavaScript) v prohlížeči oběti.
- Stored (uložené) XSS: Škodlivý kód je trvale uložen na serveru (např. v databázi) a následně se zobrazuje uživatelům.
- Reflected (odražené) XSS: Škodlivý kód je součástí URL požadavku, který je serverem "odražen" zpět k uživateli ve formě odpovědi (bez uložení na server).
- DOM-based XSS: Útok je vykonán čistě na straně klienta úpravou DOM (Document Object Model) přes klientský JavaScript.
Stored Cross Site Scripting
K tomuto problému často dochází v diskuzních fórech, komentářích nebo při zakládání účtů. Představme si registraci uživatele, kde uživatelské jméno je vykresleno bez ošetření.
Uživatel se zaregistruje pod následujícím jménem:
<script>alert(1)</script>Aplikace jméno uloží do databáze. Když se poté vykresluje tabulka uživatelů:
<table>
<tr>
<td>Name:</td>
<td><script>alert(1)</script></td>
</tr>
</table>Prohlížeč oběti, který navštíví tuto stránku, spustí tento vložený JavaScript kód.
Odstranění nebezpečných sekvencí znaků je špatná praxe. Lepší je escapování:
- Context-aware escaping: Escapování by mělo být závislé na kontextu (např. zda vkládáme do HTML těla, do atributu apod.).
- Pokud je potřeba povolit některé HTML tagy, vždy používáme whitelist (seznam povolených tagů a atributů), nikoliv blacklist.
Reflected Cross Site Scripting
Aplikace vykresluje obrázek na základě URL parametru:
https://some.website/image?path=...Obrázek se na stránce generuje následovně:
<img src="$path">Pokud útočník pošle URL s parametrem ?path="><script>alert(1)</script>", vložený HTML kód po dosazení:
<img src=""><script>alert(1)</script>">Tento kód je v odkazu zpravidla URL-enkódovaný: ?path=%22%3E%3Cscript%3Ealert(1)%3C%2Fscript%3E
DOM-based Cross Site Scripting
Podobné jako Reflected XSS, avšak parametr je přečten z URL a rovnou vložen do DOMu skrz JavaScript (aniž by to zpracovával server):
<script>
document.write(
location.search.substr(1)
)
</script>S URL typu /users?<script>alert(1)</script> se JavaScript opět vykoná.