This is an old revision of the document!
XSS napadi
XSS (Cross-site scripting) je tip napada uključenja u kojem napadač ubacuje malicioznu skriptu u web stranicu koju korisnici smatraju povjerljivom. U najranijim verzijama napada fokus napadača bila je krađa podataka cross-site zahtjevima, odnosno zahtjevima koji idu preko više stranica. Od tada je evoluirao te obuhvaća uključenje bilo kakvog sadržaja u web stranicu.
Funkcionira na način da se korisniku neke web stranice u odgovoru na njegov zahtjev vraća maliciozan
JavaScript kod, najčešće u obliku klijentske skripte. Nakon njegova izvršenja, napadač ima potpunu kontrolu
nad korisnikovim interakcijama na toj stranici. Ovo je vrlo raširen tip napada. Svaki dio web stranice u
kojemu se traži korisnički unos potencijalno je ranjiv ako nema dobre procedure validacije i pročišćavanja unosa.
Budući da su što su meta ovih napada su uvijek stranice kojima korisnici vjeruju, krajnji korisnik najčešće ne može nikako znati da je skripta koju se sprema izvršiti maliciozna. Dodatno, poverljivim stranicama korisnici rado dopuštaju pristup kolačićima, sjedničkim tokenima i sličnim osjetljivim informacijama koje skripta može iskoristiti.
Reflected XSS (Non-Persistent) je tip napada u kojem se podatci koje je unio korisnik u HTTP zahtjev odmah vrate preko odgovora na taj isti zahtjev. Stranica vrati podatke bez da je ikako provjerila jesu li ti podatci sigurni za korištenje te je iz tog razloga ranjiva. Podatci se u pravilu nigdje ne pohranjuju, već ostaju u pregledniku tog korisnika te je zato drugi naziv Non-Persistent. Uzmimo za primjer stranicu koja vraća ono što se nalazi u message parametru:
https://insecure-website.com/status?message=All+is+well.
Rezultat je
<p>Status: All is well.</p>
No, ako korisnik unese
https://insecure-website.com/status?message=<script>*+Bad+stuff+here...+*/</script>
nastaje problem jer se unijela skripta koja se može direktno izvršiti. Skripta je obično takva da napadač može pristupiti i mijenjati sve korisnikove podatke, izvoditi sve akcije na stranici koje su njemu dozvoljene te čak izvoditi napade u njegovo ime.
Stored XSS (Persistent, second-order XSS) za razliku od prethodne vrste dohvaća nesigurne podatke sa nekog poslužitelja. Ni u ovom se slučaju ne provodi nikakva provjera jesu li ti podatci sigurni za korištenje.Unos podataka može opet ići preko nekog korisničkog unosa, no razlika je u tome što se ti ranjivi podatci pohrane i mogu doći do nekog drugog korisnika. Dobar primjer je stranica sa člancima koja omogućuje komentare. Recimo da je napadač unio neku skriptu kao komentar na određeni članak. Ta skripta izvršit će se svakom korisniku koji poželi dohvatiti njegov komentar, odnosno svakom korisniku koji otvori taj članak.
Zadnji je DOM-based napad koji se odvija kad JavaScript kod web stranice uzima podatke sa izvora koji kontrolira napadač, primjerice URL, i ubacuje ga u DOM (Document Object Model) stranice. Najčešće se ubacuje u eval() ili innerHTML. Primjerice, ako napadač upadne u DOM i upiše
document.write('... <script>alert(document.domain)</script> ...');
ova će se skripta izvesti.
innerHTML ne prihvaća script elemente pa s te strane djeluje sigurnije. No, i u tom slučaju postoji zaobilazni put jer se može unijeti element koji ima atribut koji prihvaća javascript, primjerice:
element.innerHTML='... <img src=1 onerror=alert(document.domain)> ...'
I ovaj će se alert izvesti.
Ovaj se tip napada može kombinirati sa Stored i Reflected napadima jer također može koristiti URL parametre. Budući da se ova tri tipa mogu preklapati, uvedena je nova podjela - poslužiteljski i
klijentski XSS.
Poslužiteljski XSS (Server XSS) se odvija kad poslužitelj generira neprovjerene podatke uključene u HTTP zaglavlje. Izvor tih podatka može biti sam zahtjev ili neka druga lokacija, dakle može se dogoditi Reflected ili Stored napad.
Klijentski XSS (Client XSS) se odvija kad se neprovjereni podatci koriste za promjene na DOM-u. Također može biti Reflected ako se podatci dohvaćaju iz zahtjeva ili Stored ako se dohvaćaju s poslužitelja.
Zaštita od XSS napada provodi se tako što se kontroliraju podatci s kojima stranica radi. Odmah pri unosu korisničkih podataka treba provesti pročišćenje i, ako podatak ima nešto sumnjivo, spriječiti njegovo daljnje korištenje. Ako je podatak pročišćen, treba spriječiti njegove naknadne izmjene. Pri ispisu podataka treba provesti dobru metodu dekodiranja da bi se osiguralo da se podatci ne interpretiraju pogrešno, odnosno da se ne shvate kao skripta. U HTTP zahtjevima važno je koristiti zaglavlje Content-Type ili X-Content-Type-Options jer se na taj način sprečava da preglednik pogrešno interpretira odgovor.
Važno je i na dobar način kodirati varijable koje se umeću u HTML kod. Primjerice, ovaj način unosa je nesiguran:
<div> $varUnsafe </div>
jer napadač može unijeti skritpu kao varijablu, primjerice
<script>alert`1`</script>
i rezultat je
<div> <script>alert`1`</script> </div>
Zato je puno bolje vrijednosti varijable ubacivati preko nekog od sigurnih atributa, primjerice .textContent. On i još neki atributi pripadaju tzv. Safe Sinks, a to je naziv za mjesta koja su sigurna za pohranjivanje varijabli. Vrijednosti varijabli tamo tretiraju isključivo kao tekst, a nikad kao skripta pa,i ako se skripta unese,neće se izvršiti.
Osim kodiranja, važan dio je i pročišćavanje HTML koda. Jedna od preporučenih metoda je DOMPuritfy.sanize(). No, i dalje treba paziti. Ako postoji mogućnost naknadne izmjene podataka, mora se osigurati da se opet provede pročišćavanje. Uz to, ako se pročišćeni podatci šalju nekoj biblioteci na korištenje, važon je da ne rade izravne promjene nad nekim drugim podatkom. I naravno, treba redovito održavati kod koji se koristi bibliotekama za pročišćenje koda jer se svako malo otkriju neki novi nedostatci koji se poprave u novoj verziji biblioteke.
Također, kad se umeće attr element treba umetati vrijednosti preko .setAttribute jer i on spada u Safe sinks. Važno je napomenuti da su Safe sinks sigurni isključivo kad se koriste imena atributa čije su vrijednosti unaprijed definirane (primjerice id, class), no nisu uvijek pouzdani kad se koriste atributi koji prihvaćaju Javascript (onclick, onblur i slično). Kod korištenja CSS selektora preko javascripta također je sigurnije mijenjati svojstva koristeći style.{svojstvo} nego ga direktno pisati u HTML. Isto tako, dobra je praksa umetati varijable u inline javascriptu koristeći navodnike, primjerice na ovaj način
<script>alert('$varUnsafe’)</script>
<script>x=’$varUnsafe’</script>
<div onmouseover="'$varUnsafe'"</div>
Izvori [1]https://owasp.org/www-community/attacks/xss/ [2]https://owasp.org/www-community/Types_of_Cross-Site_Scripting [3]https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html [4] https://portswigger.net/web-security/cross-site-scripting