Cross-site scripting (XSS ili skriptovanje dinamički generisanih veb strana) je bezbednosna ranjivost veb-sajtova koja omogućava ubacivanje malicioznog koda sa korisničke strane na veb stranice. Ova vrsta ranjivosti daje napadačima pristup svemu što se učitava na zaraženoj veb stranici, od sesijskih kolačića, geolokacije, pa do veb kamera i mikrofona.
Kako XSS funkcioniše?
Napadač traži mesto na veb-sajtu gde može da unese podatke. To može da bude polje za komentare, traka za pretragu ili bilo koja forma u koju nešto može da se ukuca.
Kada pronađe takvo mesto, umesto da kuca normalnu poruku, napadač piše kod, najčešće JavaScript. Kod koji se ubacuje obično ima neku malicioznu namenu.
Kada drugi korisnici posete zaraženu stranicu maliciozni kod se pokreće u njihovom browseru i može da uradi sledeće:
- Prikazuje lažne login upite kako bi ukrao kredencijale.
- Hvata kolačiće (cookies) da bi preuzeo sesiju.
- Preusmerava korisnika na maliciozni sajt.
Vrste XSS-a
Postoje tri vrse Cross-Site Scripting napada:
- Stored XSS: Maliciozna skripta se ubacuje direktno na server. Obično se kod skriva u elementima sajta kao što su slike i dugmići koji se učitavaju kada se poseti sajt. Inficirani elementi pokreću maliciozni kod kada korisnik poseti sajt, a korisnik nema načina da unapred zna da je sajt zaražen.
- Reflected XSS: Kod ove vrste napada napadač šalje link ka sajtu koji izgleda legitimno, ali sadrži skriptu u sebi. Kada žrtva klikne na link, šalje se HTTP zahtev ranjivom serveru. Skripta napadača se zatim vraća ili reflektuje nazad u pretraživač nevinog korisnika. Ovde pretraživač učitava zlonamernu skriptu jer veruje u odgovor servera. Kada se učita skripta, informacije poput kolačića sesije se šalju nazad napadaču.
- DOM-Based XSS: DOM je skraćenica od Document Object Model, koji je u osnovi izvorni kod veb-sajta. XSS napad zasnovan na DOM-u se dešava kada zlonamerna skripta postoji na veb stranici koju browser učitava. Za razliku od reflektovanog XSS-a, ovi napadi ne moraju da se šalju na server da bi se aktivirali. U napadu zasnovanom na DOM-u, zlonamerna skripta se može videti u URL-u.
Kako sprečiti XSS
Sprečavanje XSS ranjivosti treba da uključuje kombinaciju sledećih mera:
- Provera unosa: Uvek proveravajte i dezinfikujte unos korisnika, da biste se uverili da ne sadrži zlonamerni kod.
- Kodiranje podataka na izlazu: Na mestu gde podaci koje kontroliše korisnik izlaze u HTTP odgovorima, kodirajte izlaz kako biste sprečili da se tumači kao aktivni sadržaj.
- Koristite bezbednosna zaglavlja: Implementirajte HTTP zaglavlja kao što je Content Security Policy (CSP) da biste ograničili izvore iz kojih se mogu učitavati skripte.
CMS platforme i XSS
Vodeće CMS platforme kao što su WordPress, Joomla, Drupal, Magentno, uključuju podrazumevanu zaštitu od XSS, tj. imaju ugrađene bezbednosne funkcije i prate najbolje prakse.
Ipak, to ne znači da treba da se opustite ako je vaš veb-sajt na nekoj od ovih platformi. XSS je i dalje najčešća ranjivost pluginova za poznate CMS platforme. U analizi koje je sproveo Wordfence pokazalo se da je čak 47% od ukupno 1599 ranjivosti Wordpress pluginova bilo XSS ranjivost.
To nam govori da, iako same platforme nisu ranjive, dodaci mogu da budu i time mogu da ugroze bezbednost celog sajta.
Da bi korisnici vašeg sajta ostali bezbedni važno je da:
- CMS redovno ažurirate: Uvek održavajte svoj CMS i njegove pluginove ili ekstenzije ažuriranim na najnovije verzije.
- Koristite bezbednosne pluginove: Mnoge CMS platforme imaju bezbednosne dodatke za dodatnu zaštitu od XSS-a i drugih ranjivosti.
- Obrazujte korisnike: Obrazujte korisnike i administratore o najboljim bezbednosnim praksama, kao što je izbegavanje instaliranja nepouzdanih pluginova i redovna provera bezbednosnih postavki.
MySpace Samy Worm
Među najpoznatijim XSS napadima izdvaja se MySpace Samy Worm.
“Davne” 2005, momak po imenu Semi Kamkar (Samy Kamkar) napravio je crva koji je iskoristio ranjivosti tada popularna društvene mreže MySpace. Ovaj crv koristio je XSS za brzo širenje po platformi.
Semi je otkrio da MySpace ne filtrira dobro unos korisnika u “About Me” odeljku profila korisnika. To mu je omogućilo da ubaci JavaScript kod u svoj profil.
Njegova skripta omogućavala je da se svakom korisniku doda u opis profila poruka "but most of all, Samy is my hero". Da bi se skripta pokrenula korisnik je trebalo da poseti Semijev profil.
Semi je shvatio da nije previše popularan, tj. da malo ljudi posećuje njegov profil, pa je nadogradio skriptu tako da je poruka "but most of all, Samy is my hero" dodavana ne samo onima koji su bili na Semijevom profilu, nego svakom ko je bio u dodiru sa bilo kojim profilom koji je već imao tu poruku.
Došlo je do viralnog efekta i u roku 20 sati i više od milion MySpace korisnika je imalo poruku "Samy is my hero" na svojim profilima. MySpace je morao da se ugasi na neko vreme da bi popravio ranjivost i uklonio crva.
MySpace Samy worm je klasični primer XSS-a i pokazuje koliko ova vrsta napada može da bude opasna i koje razmere može da dobije.
Zaključak
XSS napad može da kompromituje korisničke podatke, nanese štetu veb-sajtovima, širi malver i još mnogo toga. Posebno je opasno jer cilja korisnike veb-sajta, a ne sam veb-sajt, zloupotrebljavajući poverenje koje korisnici imaju u sajt. Zbog toga je važno onemogućiti primenu injection metoda na veb-sajtovima i aplikacijama i redovno ažurirati CMS platforme.