XSS vs CSRF
V této části vysvětlíme rozdíly mezi XSS a CSRF a probereme, zda tokeny CSRF mohou pomoci zabránit útokům XSS.
Jaký je rozdíl mezi XSS a CSRF?
Cross-site scripting (neboli XSS) umožňuje útočníkovi spustit v prohlížeči oběti libovolný JavaScript.
Cross-site request forgery (neboli CSRF) umožňuje útočníkovi přimět uživatele oběti k provedení akce, kterou nemá v úmyslu.
Důsledky zranitelností XSS jsou obecně závažnější než u zranitelností CSRF:
- CSRF se často vztahuje pouze na podmnožinu akcí, které je uživatel schopen provést. Mnoho aplikací implementuje ochranu proti CSRF obecně, ale přehlíží jednu nebo dvě akce, které zůstávají vystaveny riziku. Naopak úspěšné zneužití XSS může obvykle přimět uživatele k provedení jakékoli akce, kterou je uživatel schopen provést, bez ohledu na funkčnost, ve které zranitelnost vzniká.
- CSRF lze popsat jako „jednosměrnou“ zranitelnost v tom smyslu, že útočník sice může přimět oběť k zadání požadavku HTTP, ale nemůže získat odpověď na tento požadavek. Naproti tomu XSS je „obousměrné“ v tom smyslu, že útočníkem injektovaný skript může vydávat libovolné požadavky, číst odpovědi a exfiltrovat data do externí domény, kterou si útočník zvolí.
Mohou tokeny CSRF zabránit útokům XSS?
Některým útokům XSS lze skutečně zabránit účinným použitím tokenů CSRF. Uvažujme jednoduchou odraženou zranitelnost XSS, kterou lze takto triviálně zneužít:
https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>
Nyní předpokládejme, že zranitelná funkce obsahuje token CSRF:
https://insecure-website.com/status?csrf-token=CIwNZNlR4XbisJF39I8yWnWX9wX4WFoz&message=<script>/*+Bad+stuff+here...+*/</script>
Za předpokladu, že server správně validuje token CSRF a odmítá požadavky bez platného tokenu, pak token skutečně zabrání zneužití zranitelnosti XSS. Vodítko je zde v názvu: „cross-site scripting“, přinejmenším ve své reflektované podobě, zahrnuje cross-site požadavek. Tím, že aplikace zabrání útočníkovi zfalšovat cross-site požadavek, zabrání triviálnímu zneužití zranitelnosti XSS.
Vyvstává zde několik důležitých výhrad:
- Pokud odražená zranitelnost XSS existuje kdekoli jinde na webu v rámci funkce, která není chráněna tokenem CSRF, pak lze tuto zranitelnost XSS zneužít běžným způsobem.
- Pokud se kdekoli na webu vyskytuje zneužitelná zranitelnost XSS, pak lze tuto zranitelnost využít k tomu, aby uživatel oběti provedl akce, i když jsou tyto akce samy o sobě chráněny tokeny CSRF. V této situaci může útočníkův skript požádat příslušnou stránku o získání platného tokenu CSRF a poté tento token použít k provedení chráněné akce.
- Tokeny CSRF nechrání před uloženými zranitelnostmi XSS. Pokud je stránka chráněná tokenem CSRF zároveň výstupním bodem pro uloženou zranitelnost XSS, pak lze tuto zranitelnost XSS zneužít obvyklým způsobem a při návštěvě stránky uživatelem dojde ke spuštění zátěže XSS.