Cross-Site Scripting (XSS)

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.

Top disclosed vulnerabilities – State of Open source Report 2020 by Snyk.

Hvad er Cross-Site Scripting (XSS)?

Cross-Site Scripting er en metode til angreb på websteder, der anvender en type injektion til at implantere ondsindede scripts på websteder, der ellers ville være produktive og pålidelige. Generelt består processen i at sende et skadeligt script på browsersiden til en anden bruger. Dette er en almindelig sikkerhedsbrist i webapplikationer og kan forekomme på ethvert tidspunkt i en applikation, hvor input modtages fra browseren og bruges til at skabe output uden først at validere eller kode dataene.

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?

Udnyttelse af cross-site scripting-sårbarheder er en relativt simpel opgave for angribere. Ved at indsætte et ondsindet script i et ubeskyttet eller uvalideret input fra browseren får angriberen scriptet til at blive returneret af programmet og eksekveret i browseren. Dette kan gøre det muligt at overtage kontrollen med programmets funktionalitet, manipulere data eller placere yderligere skadelig kode.

Hvad er typerne af XSS-angreb?

Der er tre hovedtyper af XSS-angreb: reflekteret XSS, gemt XSS og DOM-baseret XSS.

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.

Figur 1: Flow for lagrede eller vedvarende XSS-angreb

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?

Testning for XSS-sårbarhed begynder i designfasen, idet der tages hensyn til bedste praksis fra begyndelsen. Designere af websteder bør indbygge sikkerhedsforanstaltninger og ikke tilføje dem efterfølgende.
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?

Der er flere vigtige tiltag til forebyggelse af XSS-angreb: Forbedre uddannelse og bevidsthed hos dine udviklere, screene og validere datainput og scanne kode for sårbarheder.

  • 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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.