Cross-site scripting – kaldet XSS – er en applikationssårbarhed, der har potentiale til at skabe ravage i applikationer og på websites. XSS er så udbredt og potentielt skadelig, at den fortsat er med på OWASP’s (Open Web Application Security Project) liste over de 10 største sårbarheder.
Faktisk er Cross-Site Scripting den mest almindelige sårbarhed, der er blevet opdaget siden 2014, og i 2019 optræder den fortsat i top 3 over rapporterede sårbarheder.
- Hvad er Cross-Site Scripting (XSS)?
- Sikring mod XSS-angreb
- Hvordan virker Cross-site Scripting?
- Hvad er typerne af XSS-angreb?
- Reflekterede XSS-angreb
- Stored XSS-angreb
- DOM-baserede XSS-angreb
- Hvad er Cross-site Scripting-angrebsvektorer?
- Hvad er virkningen af XSS-sårbarheder?
- Hvordan tester man Cross-site Scripting?
- Test din kode for XSS-sårbarheder
- Hvad er et eksempel på Cross-site Scripting?
- Hvordan kan man forhindre Cross-site Scripting?
Hvad er Cross-Site Scripting (XSS)?
I nogle tilfælde kan browser-side script også indføre denne sårbarhed, så en angriber kan udnytte den, uden at målbrugeren foretager en anmodning til webapplikationen.
Angrebsmænd udnytter XSS ved at lave ondsindet kode, der kan videresendes til en anden bruger, og som derefter udføres af den intetanende browser. Da scriptet oftest er inkluderet i indholdet af webapplikationens svar, udføres det og har samme adgang, som hvis scriptet var legitimt. Der kan gives adgang til sessionstokens, cookies og endog fortrolige eller følsomme oplysninger, som browseren har adgang til på det pågældende websted, og der kan endda ske omskrivning af HTML-sidens indhold.
Sikring mod XSS-angreb
Automatisk finde, prioritere og rette sårbarheder i de open source-afhængigheder, der bruges til at bygge dine cloud native-applikationer
Hvordan virker Cross-site Scripting?
Hvad er typerne af XSS-angreb?
Reflekterede XSS-angreb
I reflekterede XSS-angreb injiceres det skadelige script i en HTTP-forespørgsel (normalt via et specifikt udformet link, der leveres til brugeren). Som den enkleste variant bruger den inputparametre i HTTP-anmodningen, der let kan manipuleres til at inkludere det skadelige scriptindhold. Det skadelige script reflekteres derefter fra serveren i et HTTP-svar og bliver udført i offerets browser.
I dette tilfælde fungerer det som et gemt XSS uden faktisk at lagre skadelige data på serveren.
Her er et eksempel på et reflekteret XSS-angreb:
Lad os sige, at example.com/profile indeholder en name-parameter. URL’en for anmodningen ville se således ud: https://example.com/profile?user=Tammy. På baggrund af dette input ville webapplikationen således svare med “Hej Tammy” øverst på siden. Hvis parametrene ikke valideres for at sikre, at de kun indeholder forventede data, kan en angriber få en bruger til at besøge en skadelig version af URL’en som denne: https://example.com/profile?user<script>some_malicious_code</script>.
Når svaret sendes til browseren, indeholder det dette ondsindede script, som derefter udføres i browseren, sandsynligvis uden at brugeren selv ved det. Dette er et eksempel på et reflekteret XSS-angreb, da den skadelige kode straks “reflekteres” tilbage til den bruger, der foretager anmodningen.
Stored XSS-angreb
I det, der kaldes et gemt eller vedvarende XSS-angreb, leveres skadeligt indhold direkte sammen med serverens svar, når brugeren indlæser en webside. Indholdet er således allerede gemt i webstedets database (deraf navnet for sådanne angreb). Brugerne går derefter blot ind på den hackede webside og bliver ofre for sådanne angreb.
Hver eneste bruger, der åbner et sådant kompromitteret websted, risikerer således at få stjålet sine personlige data, og dette kan derfor betragtes som den farligste type XSS-angreb.
Men hvordan kommer det skadelige indhold ind i databasen til at begynde med? I de fleste tilfælde indføres det gennem ubeskyttede websideformularer, hvor brugerinput ikke er valideret og renset ordentligt. Hvis de data, der indtastes af en hacker, ikke valideres på både klient- og serversiden, vil de blive gemt i databasen. Et sådant input kan f.eks. omfatte et tekstområde til kommentarer, en teksteditor til indlæg, en editor til personlige data eller andre formularer.
Når det lykkes en angriber at sende skadeligt indhold til serveren, og dette indhold vises ufiltreret på en webside, bliver alle brugere potentielle ofre.
Det almindelige middel mod lagrede XSS-angreb er at rense input på både frontend og backend af applikationen. Sanitizing indebærer en kombination af validering af data og escaping af specialtegn eller fuldstændig filtrering af disse og er en almindelig bedste praksis for web- og JavaScript-sikkerhed.
DOM-baserede XSS-angreb
Document Object Model (DOM) er en grænseflade, der gør det muligt for programmer at læse og manipulere strukturen af en webside, dens indhold og stil. I et DOM-baseret XSS-angreb ligger sårbarheden i scriptkoden på browsersiden og kan udnyttes uden nogen som helst serverinteraktion, idet miljøet i det intetanende offers browser ændres.
Sommetider minder DOM-baserede XSS-angreb om reflekterede angreb. Ovenstående eksempel på et reflekteret XSS-angreb kan anvendes i dette tilfælde med en enkelt antagelse: Webapplikationen læser data direkte fra en forespørgselsstreng.
Lad os sige, at applikationen bruger forespørgselsparameteren “name” for straks at vise brugerens navn på skærmen, mens den venter på, at resten af en side indlæses. Uden korrekt validering kan dette give det samme resultat som ved et reflekteret angreb, hvis det lykkes hackeren at få offeret til at åbne et mistænkeligt link.
Som med lagret XSS bør udviklere for at forhindre reflekterede og DOM-baserede angreb implementere datavalidering og undgå at vise rå brugerinput, uanset om der er kommunikation med serveren eller ej.
Hvad er Cross-site Scripting-angrebsvektorer?
Der er flere vektorer, der almindeligvis anvendes i XSS-angreb:
- <script> tag: Et script-tag kan bruges til at henvise til ekstern JavaScript-kode, hvilket gør dette til det mest enkle XSS-punkt. Angribere kan også indlejre den skadelige kode i script-tagget.
- JavaScript-hændelser: En anden populær XSS-vektor, der bruges af angribere, er begivenhedsattributter, der kan anvendes i en række forskellige tags. Sådanne attributter som “onerror” og “onload” er eksempler.
- < <body> tag: Event-attributter kan også være kilden til scriptet, når de leveres via “body”-tagget.
- <img> tag: Afhængigt af den anvendte browser kan denne attribut være nyttig for angribere til at udføre JavaScript-kode.
- <iframe> tag: Denne vektor, der er særlig effektiv til phishing-angreb, gør det muligt for XSS-angrebet at indlejre en anden HTML-side i den aktuelle side.
- <input>-tag: Nogle browsere tillader manipulation via denne vektor, som kan bruges til at indlejre et script.
- <link> tag: Dette tag kan indeholde et script i stedet for den normale brug af link til eksterne stilark.
- <table> tag: Hvor baggrundsattributten normalt henviser til et billede, kan dette være kompromitteret til at henvise til det ulovlige script.
- <div>-tag: Dette tag indeholder også en baggrundsreference og kan bruges på samme måde som <table> til at henvise til et script.
- <object> tag: Skripter fra et eksternt websted kan inkluderes ved hjælp af dette tag.
Selv om der er andre vektorer, som XSS-angribere bruger i deres forsøg på at stjæle oplysninger og kompromittere websteder, er disse nogle af de mest almindeligt anvendte metoder. Udviklere skal overholde korrekte escaping- og sanitizing-praksis for at beskytte sig mod sådanne angreb.
Hvad er virkningen af XSS-sårbarheder?
XSS har potentiale til at skabe ravage på applikationer og websteder. Det faktum, at XSS har været til stede på alle OWASP’s top 10-lister, illustrerer behovet for at beskytte webapplikationer mod denne sårbarhed.
Afhængigt af angriberen og dennes ondsindede hensigt kan XSS-angreb resultere i forskellige konsekvenser, herunder:
- hijacking af en brugers session, udnyttelse af legitimationsoplysninger til at få adgang til andre websteder eller omdirigere brugeren til utilsigtede websteder,
- ændring af webstedssider eller indsættelse af afsnit på en webside,
- udførelse af scripts til at udtrække følsomme oplysninger fra cookies eller databaser,
- hvis offeret har administrative rettigheder, kan angrebet udvides til serversiden, hvilket kan forårsage yderligere skade eller hente yderligere følsomme oplysninger.
Hvordan tester man Cross-site Scripting?
De indledende test omfatter benchscans af kode for at identificere brugen af almindelige XSS-angrebsvektorer, der udgør potentielle sårbarheder. Dette gør det muligt at afhjælpe svaghederne, før den egentlige testning af applikationen begynder.
Nøgletiltag i forbindelse med testning for XSS-sårbarheder for kritiske webapplikationer omfatter:
- anvendelse af et værktøj til kodeskanning til at opdage sårbarheder, der muliggør korrektioner af koden under udviklingsprocessen,
- implementering af automatiseret testfunktionalitet, der afslører potentielle sårbarheder grundigt og hurtigt.
Test din kode for XSS-sårbarheder
Automatisk finde, prioritere og rette sårbarheder i de open source-afhængigheder, der bruges til at bygge dine cloud native-applikationer
Hvad er et eksempel på Cross-site Scripting?
Cross-site scripting kan udnyttes, når et webprogram bruger data, der leveres af browseren, til at skabe svar på brugeranmodninger. Et meget forenklet eksempel ville være et tilfælde, hvor et webprogram gør brug af en parameter i URL’en til at give brugeren et tilpasset svar.
Lad os sige, at exmple.com/profile indeholder en name-parameter. URL’en for anmodningen ville se ud som https://example.com/profile?user=Tammy. Webapplikationen svarer med “Hej Tammy” øverst på siden baseret på dette input.
Hvis brugerparameteren ikke valideres for at sikre, at den kun indeholder forventede data, kan en angriber få en bruger til at besøge en ondsindet version af URL’en, der ser således ud:
https://example.com/profile?user<script>some_malicious_code</script>.
Når svaret sendes til browseren, indeholder det dette ondsindede script, som derefter udføres i browseren, sandsynligvis uden at brugeren selv ved det. Dette er et eksempel på et reflekteret XSS-angreb. Den skadelige kode “reflekteres” straks tilbage til brugeren, der foretager anmodningen.
Hvordan kan man forhindre Cross-site Scripting?
- Uddannelse og bevidsthed: Sørg for, at alle udviklere, webstedsdesignere og QA-teams er opmærksomme på de metoder, som hackere bruger til at udnytte sårbarheder, og giv retningslinjer og bedste praksis for kodning. Dette omfatter korrekte escaping/kodningsteknikker for applikationsmiljøet (JavaScript, HTML osv.).
- Sanitize input: Uanset om det drejer sig om interne websider eller offentlige websteder, skal du aldrig stole på gyldigheden af brugerens inputdata. Screen og validér alle datafelter, især hvis de vil blive inkluderet som HTML-output.
- Scan kode: Implementer software, der scanner kode for sårbarheder, herunder cross-site scripting, for at sikre, at bedste praksis følges, og minimerer eksponeringen fra XSS og andre sårbarheder på OWASP-listen.
- Politik for indholdssikkerhed: Brug Content Security Policy (CSP) til at definere, hvad et websted kan gøre, og derved reducere risikoen for et XSS-angreb. Ved at bruge CSP kan XSS blokeres helt (ved at blokere alle in-line scripts) eller reduceres til en meget lavere risiko.
OWASP giver yderligere vejledning i, hvordan man forebygger XSS-sårbarhed med et omfattende snydeark.