Persistentes XSS
Persistentes Cross-Site Scripting (Stored XSS) ist eine besonders gefährliche Form von XSS-Angriffen, bei der schädlicher JavaScript-Code dauerhaft auf einem Server gespeichert wird – etwa in Forenbeiträgen, Kommentarfeldern, Benutzerprofilen oder Nachrichten. Sobald eine andere Person eine entsprechende Seite aufruft, wird der Code direkt im Kontext der Website ausgeführt, ohne aktives Zutun des Opfers. Der schadhafte Payload wird dabei an alle Besucher ausgeliefert, was eine hohe Reichweite und Wiederholbarkeit zur Folge hat.
Anders als beim Reflected XSS, bei dem der Angriff nur während der Übermittlung im URL-Parameter oder HTTP-Request geschieht, bleibt persistentes XSS langfristig wirksam. Diese Methode eignet sich für Session-Diebstahl, Keylogging, Phishing innerhalb legitimer Webseiten oder die Verbreitung von Malware über Drive-by-Downloads.
Schutzmaßnahmen gegen persistentes XSS
Um persistentes XSS effektiv zu verhindern, müssen Entwickler eine Kombination aus serverseitiger Validierung und clientseitiger Schutzmechanismen implementieren:
-
Context-sensitive Escaping
Alle Benutzereingaben müssen kontextsensitiv kodiert werden – je nach Platzierung im HTML, JavaScript oder in Attributen (z. B. OWASP Encoder Libraries). -
HTML-Template-Engines nutzen
Frameworks mit automatischer Kontextvalidierung (z. B. React, Angular mit domSanitizer) reduzieren das Risiko durch unsafe Bindings. -
Content Security Policy (CSP)
Eine strikte CSP-Header-Konfiguration verbietet Inline-Skripte und erlaubt nur definierte Skriptquellen (z. B.script-src 'self'
). -
Whitelisting statt Blacklisting
Statt gefährliche Zeichen zu filtern, sollte nur zugelassener Inhalt gespeichert werden. -
Sicherer Umgang mit Benutzerinhalten im Frontend
Keine dynamische Einbindung viainnerHTML
,document.write
odereval()
.
Verwandte Begriffe
-
Reflected XSS
-
CSP
-
JavaScript
-
Input Validation
-
Output Encoding
-
Secure Coding
-
Client-Side Security
Beispiel aus der Praxis
In einem Community-Forum lädt ein Nutzer einen scheinbar harmlosen Kommentar hoch – dieser enthält jedoch ein verstecktes
<script>
, das bei jedem Seitenaufruf einen Session-Cookie per HTTP an eine externe Domain sendet. Andere Nutzer, die diesen Beitrag lesen, werden unwissentlich kompromittiert. Wochenlang bleibt der Angriff unentdeckt, bis ein Sicherheitstest den gespeicherten Payload erkennt. Als Reaktion wird das Kommentar-Modul überarbeitet, Eingaben HTML-escaped und zusätzlich eine CSP eingeführt, um das Ausführen externer Skripte zu unterbinden.