XSS-attacker gör det möjligt för angripare att injicera skript på klientsidan i webbsidor som visas av andra användare. De huvudsakliga effekterna av denna sårbarhet är möjligheten att utföra alla åtgärder i den inloggade användarens kontext och läsa alla data i den inloggade användarens kontext.
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, JavaScriptkod börjar exekvera 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 ske i bakgrunden med hjälp av bankens API, eller så kan angriparen utföra dem senare med de uppgifter 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.
Datakodning med hjälp av inbyggda funktioner som finns i många programmeringsspråk.
Använda mallsystem med automatisk kodning. De flesta populära ramverk som använder sådana system skyddar oss från XSS-injektion (Django, Templates, Vue, React etc.).
Använd inte funktioner som eval eller Funktion med 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åll eller innerText.
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 .html eller .svg filer. Du kan skapa en separat domän från vilken de uppladdade filerna kommer att serveras.
Använd Innehåll-säkerhet-policy mekanism.
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