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.

Typy XSS
  • 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í.

Ukázka Stored XSS

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.

Countermeasures (Obrana proti Stored XSS)

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

Ukázka Reflected XSS

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

Ukázka DOM-based XSS

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á.