Opgeslagen XSS
Eenmaal geplant, loopt hij daarna voor elke bezoeker.
Wat is Opgeslagen XSS?
Opgeslagen cross-site scripting hoeft slechts één keer te worden geplant. Elke gebruiker die de pagina daarna laadt, voert het script van de aanvaller uit tegen zijn eigen sessie, zonder dat er op een link moet worden geklikt en er niets te merken is. U plaatst een afbeeldingstag met een onerror -handler in een gastenboek, laadt vervolgens de pagina zelf en ziet hoe uw sessiecookie wordt afgedrukt. De oplossing ontsnapt bij de weergavegrens, zodat de identieke payload die zich nog in de database bevindt, als tekst wordt weergegeven. De opgeslagen waarde hoeft nooit te worden opgeschoond om de fix te behouden.
Wat je leert in Opgeslagen XSS
- Onderscheid opgeslagen XSS van gereflecteerde XSS: de duurzame persistentie van de payload op de server verandert het bedreigingsmodel
- Leg uit waarom een <img src=x onerror=alert(...)>-tag wordt geactiveerd, zelfs als er geen <script>-tag in de payload zit
- Identificeer de HTML-escape op de weergavegrens als de juiste primaire verdediging, en leg uit waarom blokkeerlijsten op de invoerlaag en strategieën voor alleen CSP tekortschieten
- Lees een Node.js-weergavefunctie goed genoeg om een concat-in-HTML-bug op te sporen en de regel te herkennen waar de escape moet worden ingevoegd
- Begrijp dat de opgeslagen waarde precies kan blijven zoals hij is zodra de renderer correct ontsnapt. De database hoeft niet te worden opgeschoond om de oplossing te laten werken
Opgeslagen XSS — Trainingsstappen
-
Zoek het communityforum
Vandaag richt Bob zich op Signal Coast, wiens communityforum elk lid een korte openbare notitie laat posten die elk ander lid leest. Hij logt in met een wegwerpaccount en opent het gastenboek van het forum om te zien hoe het omgaat met wat mensen schrijven.
-
Notities worden weergegeven zoals geschreven
Het gastenboek doet een belofte die de meeste sites nooit zullen nakomen: het geeft elke notitie precies weer zoals geschreven, inclusief HTML. Een veld dat alles wat je typt omzet in live markeringen, is precies wat Bob hoopte te vinden.
-
Plaats een normale notitie
Ten eerste gedraagt Bob zich als ieder ander lid en plaatst hij een gewone notitie om te zien hoe het gastenboek daarmee omgaat. Het briefje sluit precies aan op de muur zoals geschreven: platte tekst, niets ongewoons. Dit is de functie die werkt zoals bedoeld.
-
Escaleer naar een script
Het veld geeft HTML weer, dus Bob geeft het een script in plaats van een zin. Zijn probe is een afbeeldingstag met een bron die niet kan worden geladen en een onerror -handler die de sessiecookie van de kijker leest. De afbeelding mislukt, de handler wordt uitgevoerd en de browser verschijnt, wat de notitie ook zegt. Hier wordt de sessie afgedrukt, het bewijs dat een notitie code kan uitvoeren met de login van de kijker eraan gekoppeld.
-
Het loopt samen met de sessie
Daar is het: de notitie draaide vanzelf en plaatste de livesessiecookie van de kijker, zonder dat er op een link werd geklikt en zonder dat er een bestand werd geopend. Vandaag een onschuldige afdruk; morgen een stil baken naar Bob's server. Bob heeft bewezen dat de muur loopt, wat een briefje ook bevat. Nu bouwt hij het echte wapen.
-
Plant de valse login
Bob ruilt de probe in voor een notitie die de pagina herschrijft in een sessie-verlopen aanmeldingsvak, met een handler die bakens geeft wat er naar zijn eigen server wordt getypt. Voor elk lid dat de muur laadt, lijkt het erop dat het forum hem of haar simpelweg heeft gevraagd om opnieuw in te loggen. De inloggegevens gaan rechtstreeks naar Bob.
-
De val is bewapend
De valse login is nu de nieuwste aantekening aan de muur, en het lijkt precies op het forum dat leden vraagt om opnieuw in te loggen. De handler stuurt alles wat erin wordt getypt rechtstreeks naar de server van Bob. Hij heeft het een keer geplant; elk lid dat het vertrouwt en tekent, overhandigt zijn wachtwoord.
-
Alice opent de muur
U bent eigenaar van de weergavecode van het gastenboek. Vanochtend praat je bij over de community, net als elke andere beheerder die zijn dag begint: open je browser en ga naar de muur. U heeft niet op een link geklikt en niets uitgevoerd. U laadt gewoon een pagina die u beheert.
-
Hit op lading
De pagina was nog maar net geladen en er verschijnt al een pop-up die uw sessiecookie afdrukt. Je hebt niets getypt en op niets geklikt. Een van Bob's aantekeningen werd weergegeven zodra de muur werd weergegeven, in uw beheerderssessie. Op zijn postuur zou dezelfde handler die sessie rechtstreeks naar hem sturen.
-
En een valse login eronder
Blader over de muur en er is een tweede notitie geplaatst: een inlogvak voor sessie verlopen dat lijkt op dat van het forum. Elk lid dat het vertrouwt en ondertekent, overhandigt zijn wachtwoord aan de aanvaller. Dit zijn opgeslagen notities die door de browser van elke kijker worden uitgevoerd. Als ingenieur die eigenaar is van deze pagina, weet u dat de oplossing in de rendercode zit.
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