Пређи на садржај

Cross-site scripting

С Википедије, слободне енциклопедије

Cross-site scripting (XSS) je tip propusta u kompjuterskoj bezbednosti tipično nađena u Web aplikacijama. XSS dozvoljava napadaču da injektuje klijentsku skriptu (Na primer JavaScript kod)[1] u web stranicu koja je kasnije pregledna drugim korisnicima. XSS slabost se može upotrebiti kako bi se zaobišla sigurnost sajta i samim tim izgubila kontrola nad istim, ili kako bi se ukrale informacije korisnika koji pristupaju sajtu. 2007. godine je zabeleženo da je razlog za oko 84% sigurnosnih propusta XSS.[2]

Pozadina

Sigurnost na web-u se bazira na nekoliko mehanizma, uključujući i koncept poverenja poznat kao politika istog porekla (engl. same-origin policy). On u suštini kaže da ako bilo koji sadržaj unutar sajta (na primer https://mojabanka.primer1.com) ima dozvolu za pristup resursima u sistemu, onda svaki sadržaj na tom sajtu deli iste privilegije, dok sadržaj sa drugog sajta (na primer https://drugisajt.primer2.com) ima svoje, odvojene, dozvole.[3]

XSS upotrebljava poznate slabosti u web aplikacijama, njihovim serverima, ili plug-in sistemima na kojima se oslanjaju. Eksploetacijom jedne od ovih, napadač implementira zlonameran sadržaj unutar sadržaj samog sajta. Kada rezultujući, kombinovani, sadržaj dostigne korisnika sa klijentske strane, sav materijal dolazi od poverljivog izvora, pa zatim računar daje puna prava skriptama te stranice. Ovim načinom, injekcijom skripta u web stranice, napadač može, sa punim pravom, preuzimati podatke o podacima na osetljivim stranicama, kolačiće, i niz drugih informacija koje pretraživači čuvaju za korisnika. XSS je, pritom, specijalan način injekcije koda u web sajtove.[4]

Prvi načini injekcije su bili JavaScript kodovi, međutim načini XSS napada su gradijalno rasli, gde su danas popularni i drugi jezici za injekciju (ActiveX, Java, VBScript, Flash, ili čak HTML).[4]

XSS slabosti su prijavljene još od 1990. Oštećeni sajtovi koji su pali pod efekat XSS-a uključuju i sajtove socijalnih mreža (Twitter[5], Facebook[6], MySpace, YouTube i Orkut).[7][8] U skorije vreme, XSS propusti su prestigli bafer propuste i postali najčešća vrsta napada, gde je 2007. godine procenjeno da je 68% sajtova nezaštićeno od ovakvih napada.[9]

Tipovi

Ne postoji samo jedna, standardna klasifikacija XSS propusta, već većina eksperta razlikuje bar dva načina XSS napada: neuporni i uporni. Neki ih takođe razvajaju u tradicionalne (prouzrokovana greškom serverskog koda) i DOM naklonjene (na klijentskoj strani koda).

Reflektujući (neuporni)

Primer neupornog XSS-a
Neuporna XSS slobast u Google-u bi mogla dozvoliti zlonameran sajt da napadne Google korisnike koji ga posećuju dok su logovani.[10]

Neuporni (ili reflektujući) XSS napadi su najčešći. [10] Ove rupe se pokazuju kada podaci, koji su dodeljeni od strane web klijenta, najčešće tipa HTTP upitnički parametar ili HTML forma, budu odmah upotrebljeni od strane serverskih skripti tako da parsiraju i prikažu rezultujuću stranicu korisniku, bez ikakve ispravne sanitizacije i zahteva. [11]

Zato što HTML dokumenti imaju prostu, serijalnu strukturu, koja meša kontrole, formate i sadržaj u jedno, svaki nevalidan podatak ubačen unutar stranice bez ispravnog HTML enkodiranja može dovesti do injekcije. [10] Klasičan primer potencijalne pretnje je pretraživanje po sajtu. Ukoliko sajt nije zaštićen, korisnik u pravougaonik za pretraživanje može uneti niz karaktera koji predstavlja HTML implementaciju JavaScript koda i samim tim oštetiti sigurnost sajta. Zato je veoma važno parsirati sve načina unosa.[12]

Reflekovani napad se tipično poručuje putem email-a ili neutralnih web sajtova. Mamac je URL standardnog izgleda, koji pokazuje na sajt u koji imate poverenja, ali sadrži XSS vektor. Ukoliko je poverljiv sajt neosiguran od XSS-a, klikom na link može prouzrokovati da žrtvin pretraživač pokrene injektovanu skriptu.

Uporni

Primer upornog XSS-a
Uporna cross-zone scripting slabost uparena sa kompjuterskim crvom je osbosobila prisluškivanje i pokretanje brojnih zlonamernih kodova u sistemu podataka preko QuickTime filmova na MySpace-u.[13]

Uporni (ili snimljeni) XSS napad je više razarajuć tip XSS slabosti. On se pojavljuje tako što se ubačeni kod snima na serveru, i zatim se trajno pojavljuje na "normalnoj" stranici. Klasičan primer ovakvog napada su komentari. Ukoliko sajt nije zaštićen, napadač može postaviti zlonameran kod unutar komentara, koji će kasnije biti sačuvan na serveru. Bilo koji korisnik koji nakon toga pristupi zaraženoj stranici je izložen tom kodu.[14]

Primera radi, pretpostavite da postoji sajt za upoznavanje, gde korisnik može pregledati tuđe profile. Radi privatnosti, sajt krije svačije i email adresu. Oni su sačuvani kao tajna na serveru. Jedini korisnik koji može videti ime i mail je sam korisnik kom pripada profil.

Napadač hoće da sazna ime korisnika na tom sajtu. Kako bi to uradio, on napiše skriptu koji se pokraće kada neko poseti njegov profil. Skripta zatim šalje poruku na njegov server o informacijama tih korisnika.

Na pitanje na sajtu "Opišite sebe", napadač daje kratak (naizgled normalan) odgovor, ali na kraju odgovora napadač još dodaje i svoju skriptu za krađu imena i email adrese. Ukoliko se skripta nalazi unutar <script> elemenata, HTML će ga protumačiti kao JavaScript i neće biti prikazan na sajtu, ali će se pokrenuti svaki put kada neki korisnik uđe na sajt, njegovo ime i email će biti preuzet i poslat na server napadača.

Uporni XSS može bizi značajniji nego bilo koji drugi napada, zato što se napad pokreće odmah po otvaranju stranice, bez ikakvog individualnog ciljanja žrtve ili navođenja na bilo kakav sajt treće strane. Na primeru iznad, skripta će uporno krasti proizvoljan broj informacija svih korisnika do onog trenutka kada administratori ne uklone tu grešku.[15]

Serverske i DOM bazirane slabosti

Primer DOM XSS napada
Pre rešavanja greške, Bugzilla stranice za greške su bile otvarane u DOM baziranom XSS napadu u kom je proizvoljan broj HTML-a i skripti moglo biti injektovano pomoću forsiranih poruka greške.[16]

Istorijski, prvi XSS napad je nađen u aplikaciji koja je sve podatke procesovala unutar servera. Korisnički unos (uključujući i XSS vektor) bi se slao na server, i zatim nazad korisniku kao web stranica. Potreba za boljom interakcijom korisnika dovela je do toga da se većina ranije serverskih zadataka danas izvršava na klijentskom nivou (na primer pomoću JavaScript-a), pa i da se zahtevi izvršavaju klijentski pomoću AJAX-a.

Kako se JavaScript sve češće pojavljivao, nova podklasa XSS napada je započela, nazvan DOM bazirani XSS napad.U DOM baziranom XSS napadu, zlonameran podatak ne dotiče server, već se potpuno reflektuje na klijentskom nivou.[17]

Primer DOM bazirane XSS-a je greška koja je pronađena 2011 u nekoliko JQuery nadogradnji.[18] Prevencija DOM baziranih XSS uključuje veoma slične mere kao tradicionalni XSS, osim što implementira JavaScript kod u poslatu web stranu.[19]

Reference