Angrebsscenarie
- Angriberen finder XSS-sårbarheden på en hjemmeside, der bruges af offeret, f.eks. en banks hjemmeside.
- Offeret er i øjeblikket logget ind på denne side
- Angriberen sender offeret en forfalsket URL
- Offeret klikker på URL'en
- På offerets Bank hjemmeside, JavaScript Kode begynder at udføre for at opfange brugerens data eller udføre en overførsel på hans vegne til angriberens konto
Det er værd at bemærke, at operationer, der udføres på vegne af offeret, kan være usynlige for offeret, da de kan finde sted i baggrunden ved hjælp af bankens API, eller angriberen kan udføre dem senere med de data, der er nødvendige for autentificering, tokens, cookies osv.
XSS-typer
1. Reflekteret XSS
Det er en, hvor HTML/JavaScript-kode indeholdt i en hvilken som helst parameter (f.eks. GET, POST eller cookie) vises som svar.
En side med et tekstinput til at søge efter noget, der sætter parameteren ?search=foo i slutningen af URL'en, når API'en forespørges. Efter indtastning af en sætning, hvis den ikke findes, placeres en returmeddelelse i HTML ex.
<div>Intet resultat fundet for <b>Fjols</b></div>
Vi kan prøve at sætte URL'en ind ?search=...
2.DOM XSS
Det er, når dens udførelse aktiveres ved brug af farlige funktioner i JavaScript, såsom `eval` eller `innerHtml`. "Live-eksemplet" nedenfor viser et DOM XSS-angreb baseret på `innerHtml` funktion.
3. Gemt XSS
Her bliver den ondsindede kode skrevet på serversiden. Vi kan f.eks. sende en kommentar med ondsindet kode til et blogindlæg, som uploades til serveren. Dens opgave er f.eks. at vente på administratorens moderering og derefter stjæle hans sessionsdata osv.
Injektionsmetoder
1. I tag-indholdet
`onerror=alert('XSS')`ind i
<img src onerror="alert('XSS')" />
2. I indholdet af attributten
`" onmouseover=alert('XSS')` ind i
<div class="" onmouseover="alert('XSS')""></div>
- I indholdet af attributten uden anførselstegnene
x onclick=alert('XSS')ind i
<div class="x" onclick="alert('XSS')"></div>
- I
hrefef-attribut
javascript:alert('XSS') ind i
<a href="javascript:alert('XSS')"></a>
- I strengen inde i JavaScript-koden
";alert('XSS')//. ind i
.
- I attributten med JavaScript-begivenheden
');alert('XSS')//. hvor ' er et enkelt anførselstegn, i
<div onclick="change('');alert('XSS')//')">John</div>
- I
hrefattribut inde i JavaScript-protokollen
);alert(1)// hvor %27 er et enkelt anførselstegn, i
<a href="javascript:change('%27);alert(1)//')">klik</a>
Et levende eksempel
Forsvarsmetoder
- Datakodning ved hjælp af indbyggede funktioner, der findes i mange programmeringssprog.
- Brug af skabelonsystemer med automatisk kodning. De fleste af de populære frameworks, der bruger sådanne systemer, beskytter os fra XSS-injektion (Django, skabeloner, Vue, React osv.).
- Brug ikke funktioner som
evalellerFunktionmed brugerdata, der ikke er tillid til. - Brug ikke funktioner og egenskaber, der tildeler HTML-kode direkte til DOM-træelementerne, f.eks,
innerHTML,ydreHTML,indsætAdjacentHTML,ocument.write. I stedet kan du bruge funktioner, der tildeler tekst direkte til disse elementer, f.eks.tekstIndholdellerindreTekst. - Vær forsigtig, når du omdirigerer brugeren til en URL, der er under hans kontrol. Risiko for injektion
location = 'javascript('XSS')'. - Filtrer HTML ved hjælp af biblioteker som f.eks.
DOMPurify. - Vær forsigtig med at uploade
.htmleller.svgfiler. Du kan oprette et separat domæne, hvorfra de uploadede filer vil blive serveret. - Brug den
Politik for indholdssikkerhedmekanisme. - Tag et kig på de anti-XSS-filtre, der er indbygget i de mest populære browsere.
Hvis du synes, at denne artikel er interessant, så følg Lukasz på Github: https://github.com/twistezo
Læs mere om det:
Strategier for at hente data i NextJS