Angular
The Checklist
Checklist from here.
What is Angular
Angular is 'n kragtige en oopbron front-end raamwerk wat deur Google onderhou word. Dit gebruik TypeScript om kode leesbaarheid en foutopsporing te verbeter. Met sterk sekuriteitsmeganismes, keer Angular algemene kliënt-kant kwesbaarhede soos XSS en oop omleidings. Dit kan ook aan die bediener-kant gebruik word, wat sekuriteitsoorwegings belangrik maak van albei kante.
Framework architecture
In orde om die basiese beginsels van Angular beter te verstaan, laat ons deur sy essensiële konsepte gaan.
Gewone Angular projek lyk gewoonlik soos:
Volgens die dokumentasie het elke Angular-toepassing ten minste een komponent, die wortelkomponent (AppComponent
) wat 'n komponenthiërargie met die DOM verbind. Elke komponent definieer 'n klas wat toepassingsdata en -logika bevat, en is geassosieer met 'n HTML-sjabloon wat 'n weergawe definieer wat in 'n teikenomgewing vertoon moet word. Die @Component()
dekorator identifiseer die klas onmiddellik daaronder as 'n komponent, en verskaf die sjabloon en verwante komponent-spesifieke metadata. Die AppComponent
is gedefinieer in die app.component.ts
-lêer.
Angular NgModules verklaar 'n kompileringskonteks vir 'n stel komponente wat toegewy is aan 'n toepassingsdomein, 'n werksvloei, of 'n nou verwante stel vermoëns. Elke Angular-toepassing het 'n wortelmodule, konvensioneel genoem AppModule
, wat die opstartmeganisme verskaf wat die toepassing begin. 'n Toepassing bevat tipies baie funksionele modules. Die AppModule
is gedefinieer in die app.module.ts
-lêer.
Die Angular Router
NgModule bied 'n diens wat jou toelaat om 'n navigasiepunt tussen die verskillende toepassingsstate en weergavehiërargieë in jou toepassing te definieer. Die RouterModule
is gedefinieer in die app-routing.module.ts
-lêer.
Vir data of logika wat nie geassosieer is met 'n spesifieke weergawe nie, en wat jy oor komponente wil deel, skep jy 'n diensklas. 'n Diensklasdefinisie word onmiddellik voorafgegaan deur die @Injectable()
dekorator. Die dekorator verskaf die metadata wat toelaat dat ander verskaffers as afhanklikhede in jou klas ingespuit kan word. Afhanklikheidsinjeksie (DI) laat jou toe om jou komponentklasse slank en doeltreffend te hou. Hulle haal nie data van die bediener af nie, valideer nie gebruikersinvoer nie, of log nie direk na die konsole nie; hulle delegeer sulke take aan dienste.
Sourcemap konfigurasie
Die Angular-raamwerk vertaal TypeScript-lêers na JavaScript-kode deur die tsconfig.json
opsies te volg en bou dan 'n projek met die angular.json
konfigurasie. Kyk na die angular.json
-lêer, het ons 'n opsie opgemerk om 'n sourcemap in te skakel of te deaktiveer. Volgens die Angular-dokumentasie het die standaardkonfigurasie 'n sourcemap-lêer wat geaktiveer is vir skrifte en is nie standaard versteek nie:
Resultaat: <script>alert(1)</script><h1>test</h1>
2. Binding aan eienskappe, attribuut, klasse en style of [attribute]="user_input"
- voer sanitisering uit gebaseer op die verskafde sekuriteitskonteks.
Resultaat: <div><h1>test</h1></div>
Daar is 6 tipes SecurityContext
:
None
;HTML
word gebruik, wanneer die waarde as HTML geïnterpreteer word;STYLE
word gebruik, wanneer CSS aan diestyle
eiendom gebind word;URL
word gebruik vir URL eiendomme, soos<a href>
;SCRIPT
word gebruik vir JavaScript kode;RESOURCE_URL
as 'n URL wat as kode gelaai en uitgevoer word, byvoorbeeld, in<script src>
.
Kwesbaarhede
Bypass Security Trust metodes
Die Angular stel 'n lys met metodes bekend om sy standaard sanitisering proses te omseil en om aan te dui dat 'n waarde veilig in 'n spesifieke konteks gebruik kan word, soos in die volgende vyf voorbeelde:
bypassSecurityTrustUrl
word gebruik om aan te dui dat die gegewe waarde 'n veilige styl URL is:
bypassSecurityTrustResourceUrl
word gebruik om aan te dui dat die gegewe waarde 'n veilige hulpbron URL is:
bypassSecurityTrustHtml
word gebruik om aan te dui dat die gegewe waarde veilige HTML is. Let daarop dat die invoeging vanscript
elemente in die DOM-boom op hierdie manier nie sal veroorsaak dat hulle die ingeslote JavaScript kode uitvoer nie, as gevolg van hoe hierdie elemente aan die DOM-boom bygevoeg word.
bypassSecurityTrustScript
word gebruik om aan te dui dat die gegewe waarde veilige JavaScript is. Ons het egter gevind dat die gedrag daarvan onvoorspelbaar is, omdat ons nie JS kode in sjablone kon uitvoer nie met behulp van hierdie metode.
bypassSecurityTrustStyle
word gebruik om aan te dui dat die gegewe waarde veilige CSS is. Die volgende voorbeeld illustreer CSS-inspuiting:
Angular bied 'n sanitize
metode aan om data te sanitiseren voordat dit in weergawes vertoon word. Hierdie metode gebruik die sekuriteitskonteks wat verskaf word en reinig die invoer dienooreenkomstig. Dit is egter van kardinale belang om die korrekte sekuriteitskonteks vir die spesifieke data en konteks te gebruik. Byvoorbeeld, om 'n sanitisateur met SecurityContext.URL
op HTML-inhoud toe te pas, bied nie beskerming teen gevaarlike HTML-waardes nie. In sulke scenario's kan die misbruik van sekuriteitskonteks lei tot XSS kwesbaarhede.
HTML inspuiting
Hierdie kwesbaarheid ontstaan wanneer gebruikersinvoer aan enige van die drie eienskappe gebind word: innerHTML
, outerHTML
, of iframe
srcdoc
. Terwyl binding aan hierdie attribuut HTML interpreteer soos dit is, word die invoer gesanitisereer met behulp van SecurityContext.HTML
. Dus, HTML inspuiting is moontlik, maar kruis-web scripting (XSS) is nie.
Voorbeeld van die gebruik van innerHTML
:
Die resultaat is <div><h1>test</h1></div>
.
Sjabloon inspuiting
Kliënt-kant Rendering (CSR)
Angular benut sjablone om bladsye dinamies te konstrueer. Die benadering behels die insluiting van sjabloonuitdrukkings wat Angular moet evalueer binne dubbele krulhakies ({{}}
). Op hierdie manier bied die raamwerk bykomende funksionaliteit. Byvoorbeeld, 'n sjabloon soos {{1+1}}
sou as 2 vertoon.
Tipies, Angular ontsnap gebruikersinvoer wat verwar kan word met sjabloonuitdrukkings (bv. karakters soos `< > ' " ``). Dit beteken dat bykomende stappe nodig is om hierdie beperking te omseil, soos om funksies te gebruik wat JavaScript-stringobjekte genereer om te verhoed dat geblacklisted karakters gebruik word. Om dit te bereik, moet ons egter die Angular-konteks, sy eienskappe en veranderlikes oorweeg. Daarom kan 'n sjabloon inspuitingsaanval soos volg voorkom:
As shown above: constructor
verwys na die omvang van die Object constructor
eiendom, wat ons in staat stel om die String constructor aan te roep en 'n arbitrêre kode uit te voer.
Server-Side Rendering (SSR)
In teenstelling met CSR, wat in die blaaier se DOM plaasvind, is Angular Universal verantwoordelik vir SSR van sjabloonlêers. Hierdie lêers word dan aan die gebruiker gelewer. Ondanks hierdie onderskeid, pas Angular Universal dieselfde sanitasie-meganismes toe wat in CSR gebruik word om SSR-sekuriteit te verbeter. 'n Sjabloon-inspuitingskwesbaarheid in SSR kan op dieselfde manier as in CSR opgespoor word, omdat die gebruikte sjabloontaal dieselfde is.
Natuurlik is daar ook 'n moontlikheid om nuwe sjabloon-inspuitingskwesbaarhede in te voer wanneer derdeparty-sjabloon-enjins soos Pug en Handlebars gebruik word.
XSS
DOM interfaces
Soos voorheen vermeld, kan ons die DOM direk benader met die Document interface. As gebruikersinvoer nie vooraf gevalideer word nie, kan dit lei tot cross-site scripting (XSS) kwesbaarhede.
Ons het die document.write()
en document.createElement()
metodes in die voorbeelde hieronder gebruik:
Angular klasse
Daar is 'n paar klasse wat gebruik kan word om met DOM-elemente in Angular te werk: ElementRef
, Renderer2
, Location
en Document
. 'n Gedetailleerde beskrywing van die laaste twee klasse word in die Open redirects afdeling gegee. Die hoofverskil tussen die eerste twee is dat die Renderer2
API 'n laag van abstraksie tussen die DOM-element en die komponentkode bied, terwyl ElementRef
net 'n verwysing na die element hou. Daarom, volgens Angular-dokumentasie, moet die ElementRef
API slegs as 'n laaste uitweg gebruik word wanneer direkte toegang tot die DOM benodig word.
ElementRef
bevat die eienskapnativeElement
, wat gebruik kan word om die DOM-elemente te manipuleer. Onbehoorlike gebruik vannativeElement
kan egter lei tot 'n XSS-inspuitingskwesbaarheid, soos hieronder getoon:
Ten spyte van die feit dat
Renderer2
'n API bied wat veilig gebruik kan word selfs wanneer direkte toegang tot inheemse elemente nie ondersteun word nie, het dit steeds 'n paar sekuriteitsfoute. MetRenderer2
is dit moontlik om eienskappe op 'n HTML-element in te stel met diesetAttribute()
metode, wat geen XSS voorkoming meganismes het nie.
Om die eienskap van 'n DOM-element in te stel, kan jy die
Renderer2.setProperty()
metode gebruik en 'n XSS-aanval ontketen:
Tydens ons navorsing het ons ook die gedrag van ander Renderer2
metodes, soos setStyle()
, createComment()
, en setValue()
, in verband met XSS en CSS inspuitings ondersoek. Ons kon egter nie enige geldige aanvalsvectors vir hierdie metodes vind nie weens hul funksionele beperkings.
jQuery
jQuery is 'n vinnige, klein, en kenmerkryke JavaScript-biblioteek wat in die Angular-projek gebruik kan word om te help met die manipulasie van die HTML DOM-objekte. Soos bekend, kan hierdie biblioteek se metodes egter uitgebuit word om 'n XSS-kwesbaarheid te bereik. Om te bespreek hoe sommige kwesbare jQuery metodes in Angular projekte uitgebuit kan word, het ons hierdie subafdeling bygevoeg.
Die
html()
metode kry die HTML-inhoud van die eerste element in die stel van ooreenstemmende elemente of stel die HTML-inhoud van elke ooreenstemmende element. Volgens ontwerp kan enige jQuery-konstruksie of metode wat 'n HTML-string aanvaar, potensieel kode uitvoer. Dit kan gebeur deur die inspuiting van<script>
etikette of die gebruik van HTML-eienskappe wat kode uitvoer, soos in die voorbeeld getoon.
Die
jQuery.parseHTML()
metode gebruik inheemse metodes om die string na 'n stel DOM-knope om te skakel, wat dan in die dokument ingevoeg kan word.
Soos voorheen genoem, sal die meeste jQuery API's wat HTML-string aanvaar, skripte wat in die HTML ingesluit is, uitvoer. Die jQuery.parseHTML()
metode voer nie skripte in die geparseerde HTML uit nie, tensy keepScripts
eksplisiet true
is. Dit is egter steeds moontlik in die meeste omgewings om skripte indirek uit te voer; byvoorbeeld, via die <img onerror>
eienskap.
Open redirects
DOM interfaces
Volgens die W3C-dokumentasie word die window.location
en document.location
objek as aliase in moderne blaaiers behandel. Dit is waarom hulle soortgelyke implementasies van sommige metodes en eienskappe het, wat 'n oop omleiding en DOM XSS met javascript://
skema-aanvalle kan veroorsaak, soos hieronder genoem.
window.location.href
(endocument.location.href
)
Die kanonieke manier om die huidige DOM-lokasie objek te kry, is deur window.location
te gebruik. Dit kan ook gebruik word om die blaaier na 'n nuwe bladsy te herlei. As gevolg hiervan, om beheer oor hierdie objek te hê, stel ons in staat om 'n oop omleiding kwesbaarheid te benut.
Die uitbuitingsproses is identies vir die volgende scenario's.
window.location.assign()
(endocument.location.assign()
)
Hierdie metode laat die venster toe om die dokument by die gespesifiseerde URL te laai en weer te gee. As ons beheer oor hierdie metode het, kan dit 'n sink vir 'n oop omleiding aanval wees.
window.location.replace()
(endocument.location.replace()
)
Hierdie metode vervang die huidige hulpbron met die een by die gegewe URL.
Dit verskil van die assign()
metode in die sin dat die huidige bladsy nie in sessiegeskiedenis gestoor sal word nie na die gebruik van window.location.replace()
. Dit is egter ook moontlik om 'n oop omleiding kwesbaarheid te benut wanneer ons beheer oor hierdie metode het.
window.open()
Die window.open()
metode neem 'n URL en laai die hulpbron wat dit identifiseer in 'n nuwe of bestaande tab of venster. Om beheer oor hierdie metode te hê, kan ook 'n geleentheid wees om 'n XSS of oop omleiding kwesbaarheid te ontketen.
Angular klasse
Volgens Angular-dokumentasie is Angular
Document
dieselfde as die DOM-dokument, wat beteken dat dit moontlik is om algemene vektore vir die DOM-dokument te gebruik om kliëntkant kwesbaarhede in die Angular te benut.Document.location
eienskappe en metodes kan sinke wees vir suksesvolle oop omleiding aanvalle soos in die voorbeeld getoon:
Tydens die navorsingsfase het ons ook die Angular
Location
klas vir oop omleiding kwesbaarhede hersien, maar geen geldige vektore is gevind nie.Location
is 'n Angular diens wat toepassings kan gebruik om met 'n blaaiers huidige URL te kommunikeer. Hierdie diens het verskeie metodes om die gegewe URL te manipuleer -go()
,replaceState()
, enprepareExternalUrl()
. Ons kan egter nie hulle gebruik vir herleiding na die eksterne domein nie. Byvoorbeeld:
Resultaat: http://localhost:4200/http://google.com/about
Die Angular
Router
klas word hoofsaaklik gebruik om binne dieselfde domein te navigeer en voeg nie enige addisionele kwesbaarhede by die toepassing nie:
Resultaat: http://localhost:4200/https:
Die volgende metodes navigeer ook binne die domein se omvang:
Verwysings
Last updated