DOM XSS
De payload bereikt nooit de server. Het loopt nog steeds.
Wat is DOM XSS?
DOM-gebaseerde XSS is de cross-site scripting die uw server nooit ziet. De payload bevindt zich in het URL-fragment, document.referrer of een postMessage -body, en JavaScript aan de clientzijde schrijft het naar innerHTML . Server-side filters en webapplicatie-firewalls zijn er blind voor. U verpakt een img onerror -payload in een deellink voor een notitieviewer, opent deze zelf, traceert de stroom van bron naar sink en repareert deze met textContent zodat de browser een tekstknooppunt bouwt in plaats van de markeringen te parseren.
Wat je leert in DOM XSS
- Herken het source-to-sink-patroon: een door een aanvaller bestuurde DOM-bron (location.hash, document.referrer, postMessage) die een gevaarlijke DOM-sink voedt (innerHTML, eval, document.write)
- Leg uit waarom de URL-hash de server nooit bereikt en waarom WAF/server-side filters blind zijn voor DOM XSS
- Pas de juiste primaire oplossing toe: verwissel de gevaarlijke sink (innerHTML) voor een veilige (textContent), niet filteren op de server of herschrijven van invoer
- Onderscheid DOM XSS van Reflected en Stored XSS door waar de lading naartoe stroomt en waar de oplossing moet landen
- Controleer een codebase voor aangrenzende source-to-sink-pijplijnen zodra er een bug opduikt
DOM XSS — Trainingsstappen
-
Open de tool voor het delen van notities
Vandaag richt Bob zich op Tideline Federal, wiens personeel snelle aantekeningen doorgeeft via een interne deeltool. U schrijft een notitie, de tool geeft u een link en iedereen die de link opent, leest de notitie in zijn browser. Bob opent de componist om te zien hoe een notitie een link wordt.
-
Deel een normale notitie
Eerst deelt Bob een gewone opmerking om te zien hoe de tool een link opbouwt. Wat hij ook schrijft, het wordt in de link zelf verpakt.
-
Het briefje rijdt in de link
Daar is de deellink. De hele noot zit erin, in het gedeelte na de # . Wanneer iemand de link opent, leest de kijker dat fragment en geeft het weer. Niets van het briefje bereikt ooit de server van Tideline.
-
Maak een testlading
De kijker zet alles wat de notitie bevat als HTML op de pagina neer. Dus schrijft Bob een notitie die niet echt een notitie is: een afbeeldingstag waarvan de bron niet kan worden geladen, met daarin een onerror -handler. Wanneer de afbeelding mislukt, wordt de handler uitgevoerd en wordt alle code die deze bevat uitgevoerd in de browser van degene die de link opent. Hij begint met het eenvoudigst mogelijke bewijs, een gewone alert(1) , om te bevestigen dat zijn code überhaupt werkt.
-
Test de lading
Voordat hij iets bewapent, bekijkt Bob een voorbeeld van zijn eigen link om te controleren of de lading wordt geactiveerd. Met Voorbeeld wordt de notitie precies geopend zoals een ontvanger deze zou zien. Op het moment dat de kijker het laadt, verschijnt de waarschuwing. Zijn code wordt precies zoals gepland in de browser uitgevoerd.
-
Bewapen het
Het bewijs werkt, dus nu maakt Bob het gevaarlijk. Hij gaat terug naar de componist en ruilt de onschuldige waarschuwing in voor een regel die de sessiecookie van de bezoeker leest, het token waarmee hij of zij ingelogd blijft. Een echte lading zou dat cookie zonder geluid naar zijn eigen server sturen. Hier wordt de gestolen waarde in beeld gebracht, zodat u precies kunt zien wat er wordt vastgelegd.
-
Stuur de link naar een slachtoffer
Bob e-mailt de bewapende link naar Alice, een Tideline-ingenieur die de hele dag gedeelde notities opent. Het is opgemaakt als een briefje dat voorafgaand aan haar ochtendbespreking wordt gedeeld, dus ze heeft geen reden om te aarzelen.
-
Er komt een gedeelde notitie binnen
De e-mail van Bob is onderweg. Jij bent eigenaar van de viewercode van de tool voor het delen van notities en een gedeelde notitie belandt vlak voor je beoordeling om 10:00 uur in je inbox. Open het en open vervolgens de notitie.
-
Open de gedeelde notitie
Niets ziet er vreemd uit, dus je opent het briefje zoals je tientallen andere opent.
-
Het briefje steelt je sessie
Op het moment dat de notitie werd geladen, werd deze pop-up in uw browser geactiveerd en wordt uw eigen sessiecookie weergegeven, het token waarmee u ingelogd blijft. Je hebt op niets geklikt en niets getypt. De gedeelde notitie bevatte een script en las alleen je sessie en had deze rechtstreeks naar een aanvaller kunnen sturen. Dat is een volledige accountovername door één link te openen.
Dekking van beveiligingsframeworks
OWASP Top 10
- A05:2025 Injection
- A03:2021 Injection
CWE
- CWE-79 Improper Neutralization of Input During Web Page Generation
CIS Controls
- CIS 16 Application Software Security
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.PS Platform Security