Scenario för attack
- Angriparen hittar XSS-sårbarheten på en webbplats som används av offret, t.ex. en banks webbplats
- Offret är för närvarande inloggad på denna sida
- Angriparen skickar offret en förfalskad URL
- Offret klickar på webbadressen
- På offrets bank webbplats, JavaScript kod börjar exekveras för att avlyssna användarens data eller utföra en överföring för hans räkning till angriparens konto
Det är värt att notera att operationer som utförs för offrets räkning kan vara osynliga för offret, eftersom de kan äga rum i bakgrunden med hjälp av bankens API, eller så kan angriparen utföra dem senare med de data som behövs för autentisering, tokens, cookies etc.
XSS-typer
1. Reflekterad XSS
Detta är en metod där HTML/JavaScript-kod som ingår i en parameter (t.ex. GET, POST eller cookie) visas i svaret.
En sida med en textinmatning för att söka efter något som sätter parametern ?sök=foo i slutet av URL:en när du frågar API:et. Om en fras inte hittas efter att den har angetts, placeras ett returmeddelande i HTML ex.
<div>Inget resultat hittades för <b>Foo</b></div>
Vi kan försöka lägga in URL:en ?search=...
2.DOM XSS
Detta är när dess utförande möjliggörs genom användning av farliga funktioner i JavaScript, t.ex. `eval` eller `innerHtml`. "Live-exemplet" nedan visar en DOM XSS-attack baserad på `innerHtml` funktion.
3. Lagrad XSS
Det här är ett fall där den skadliga koden skrivs på serversidan. Vi kan t.ex. skicka en kommentar med skadlig kod till ett blogginlägg som laddas upp på servern. Dess uppgift är t.ex. att vänta på administratörens moderering och sedan stjäla hans sessionsdata osv.
Injektionsmetoder
1. I taggens innehåll
`onerror=alert('XSS')`in i
<img src onerror="alert('XSS')" />
2. I innehållet i attributet
`" onmouseover=varning('XSS')` in i
<div class="" onmouseover="alert('XSS')""></div>
- I innehållet i attributet utan citattecken
x onclick=varning('XSS')in i
<div class="x" onclick="alert('XSS')"></div>
- I
hrefef-attribut
javascript:alert('XSS') in i
<a href="javascript:alert('XSS')"></a>
- I strängen inuti JavaScript-koden
";alert('XSS')// in i
<script>let username="";alert('XSS')//";</script>
- I attributet med händelsen JavaScript
');alert('XSS')// där ' är ett enkelt citat, till
<div onclick="change('');alert('XSS')//')">John</div>
- I
hrefattribut i JavaScript-protokollet
);alert(1)// där %27 är ett enkelt citat, till
<a href="javascript:change('%27);alert(1)//')">Klicka</a>
Live exempel
Försvarsmetoder
- Datakodning med hjälp av inbyggda funktioner som finns i många programmeringsspråk.
- Använda mallsystem med automatisk kodning. De flesta av de populära ramverken som använder sådana system skyddar oss från XSS-injektion (Django, Mallar, Vue, React etc.).
- Använd inte funktioner som
evalellerFunktionmed otillförlitliga användardata. - Använd inte funktioner och egenskaper som tilldelar HTML-kod direkt till DOM-trädelementen, t.ex,
innerHTML,yttreHTML,infogaAdjacentHTML,ocument.skriv. Istället kan du använda funktioner som tilldelar text direkt till dessa element, t.ex.textinnehållellerinnerText. - Var försiktig när du omdirigerar användaren till en URL som är under hans kontroll. Risk för injektion
location = 'javascript('XSS')'. - Filtrera HTML med hjälp av bibliotek som t.ex.
DOMPurify. - Var försiktig när du laddar upp
.htmleller.svgfiler. Du kan skapa en separat domän från vilken de uppladdade filerna kommer att serveras. - Använd
Innehåll-säkerhet-policymekanism. - Ta en titt på de anti-XSS-filter som finns inbyggda i de flesta populära webbläsare.
Om du tycker att den här artikeln är intressant kan du följa Lukasz på Github: https://github.com/twistezo
Läs mer om detta:
Strategier för datahämtning i NextJS