XSS vs CSRF
Ebben a részben elmagyarázzuk az XSS és a CSRF közötti különbségeket, és megvitatjuk, hogy a CSRF tokenek segíthetnek-e az XSS-támadások megelőzésében.
Mi a különbség az XSS és a CSRF között?
A Cross-site scripting (vagy XSS) lehetővé teszi a támadó számára, hogy tetszőleges JavaScriptet hajtson végre az áldozat felhasználó böngészőjében.
A Cross-site request forgery (vagy CSRF) lehetővé teszi a támadó számára, hogy az áldozat felhasználóját olyan műveletek végrehajtására késztesse, amelyeket nem szándékozik.
Az XSS sebezhetőségek következményei általában súlyosabbak, mint a CSRF sebezhetőségeké:
- A CSRF gyakran csak a felhasználó által elvégezhető műveletek egy részhalmazára vonatkozik. Sok alkalmazás általánosságban CSRF-védelmet valósít meg, de figyelmen kívül hagy egy-két műveletet, amelyek védtelenek maradnak. Ezzel szemben egy sikeres XSS exploit általában minden olyan művelet elvégzésére ráveheti a felhasználót, amelyet a felhasználó képes végrehajtani, függetlenül attól a funkciótól, amelyben a sebezhetőség felmerül.
- A CSRF “egyirányú” sebezhetőségként írható le, mivel a támadó ugyan ráveheti az áldozatot egy HTTP-kérés kibocsátására, de a kérésre adott választ nem tudja lekérni. Ezzel szemben az XSS “kétirányú”, mivel a támadó által bejuttatott szkript tetszőleges kéréseket adhat ki, elolvashatja a válaszokat, és adatokat szivárogtathat ki egy, a támadó által kiválasztott külső tartományba.
A CSRF tokenek megakadályozhatják az XSS-támadásokat?
Néhány XSS-támadás valóban megelőzhető a CSRF tokenek hatékony használatával. Tekintsünk egy egyszerű reflektált XSS sebezhetőséget, amely triviálisan kihasználható így:
https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>
Most tegyük fel, hogy a sebezhető funkció tartalmaz egy CSRF tokent:
https://insecure-website.com/status?csrf-token=CIwNZNlR4XbisJF39I8yWnWX9wX4WFoz&message=<script>/*+Bad+stuff+here...+*/</script>
Feltételezve, hogy a kiszolgáló megfelelően érvényesíti a CSRF-tokent, és elutasítja az érvényes token nélküli kéréseket, akkor a token valóban megakadályozza az XSS sebezhetőség kihasználását. A nyom itt a névben rejlik: a “cross-site scripting”, legalábbis a tükrözött formában, oldalközi kérést foglal magában. Azzal, hogy az alkalmazás megakadályozza, hogy a támadó meghamisítson egy cross-site kérést, megakadályozza az XSS sebezhetőség triviális kihasználását.
Itt néhány fontos fenntartás merül fel:
- Ha egy visszavert XSS sebezhetőség bárhol máshol is létezik a webhelyen egy olyan funkcióban, amelyet nem véd CSRF token, akkor ez az XSS a szokásos módon kihasználható.
- Ha a webhelyen bárhol létezik egy kihasználható XSS sebezhetőség, akkor a sebezhetőség kihasználható arra, hogy az áldozat felhasználója műveleteket hajtson végre, még akkor is, ha ezek a műveletek maguk CSRF tokenekkel védettek. Ebben a helyzetben a támadó szkriptje lekérheti az adott oldalt, hogy érvényes CSRF-tokenhez jusson, majd a token segítségével elvégezheti a védett műveletet.
- A CSRF tokenek nem nyújtanak védelmet a tárolt XSS sebezhetőségek ellen. Ha egy CSRF tokennel védett oldal egyben egy tárolt XSS sebezhetőség kimeneti pontja is, akkor ez az XSS sebezhetőség a szokásos módon kihasználható, és az XSS hasznos teher végrehajtódik, amikor a felhasználó meglátogatja az oldalt.