DOM XSS
Die Nutzlast erreicht nie den Server. Es läuft immer noch.
Was ist DOM XSS?
DOM-basiertes XSS ist das Cross-Site-Scripting, das Ihr Server nie sieht. Die Nutzlast befindet sich im URL-Fragment, document.referrer oder einem postMessage -Körper, und clientseitiges JavaScript schreibt sie in innerHTML . Serverseitige Filter und Webanwendungs-Firewalls sind für all das blind. Sie packen eine img onerror -Nutzlast in einen Freigabelink für einen Notiz-Viewer, öffnen ihn selbst, verfolgen den Fluss von der Quelle zur Senke und reparieren ihn mit textContent , sodass der Browser einen Textknoten erstellt, anstatt Markup zu analysieren.
Was Sie lernen in DOM XSS
- Erkennen Sie das Muster von Quelle zu Sink: Eine vom Angreifer kontrollierte DOM-Quelle (location.hash, document.referrer, postMessage) speist einen gefährlichen DOM-Sink (innerHTML, eval, document.write).
- Erklären Sie, warum der URL-Hash den Server nie erreicht und weshalb WAFs bzw. serverseitige Filter für DOM XSS blind sind.
- Wenden Sie die richtige zentrale Korrektur an: Ersetzen Sie den gefährlichen Sink (innerHTML) durch einen sicheren (textContent), nicht durch serverseitige Filterung oder das Umschreiben von Eingaben.
- Unterscheiden Sie DOM XSS von Reflected und Stored XSS anhand des Flusses der Nutzlast und der Stelle, an der die Korrektur erfolgen muss.
- Prüfen Sie eine Codebasis auf ähnliche Quelle-zu-Sink-Pfade, sobald ein Fehler auftritt.
DOM XSS — Trainingsschritte
-
Öffnen Sie das Tool zum Teilen von Notizen
Heute nimmt Bob Tideline Federal ins Visier. Die Mitarbeitenden teilen kurze Notizen über ein internes Tool. Sie schreiben eine Notiz, das Tool erstellt einen Link, und alle, die ihn öffnen, lesen die Notiz im Browser. Bob öffnet den Editor, um zu sehen, wie aus einer Notiz ein Link wird.
-
Teilen Sie eine normale Notiz
Zunächst teilt Bob eine gewöhnliche Notiz, um zu sehen, wie das Tool einen Link erstellt. Alles, was er schreibt, wird in den Link selbst gepackt.
-
Die Notiz steckt im Link
Hier ist der Freigabelink. Die gesamte Notiz steht darin, im Teil nach # . Wenn jemand den Link öffnet, liest der Viewer dieses Fragment und rendert es. Die Notiz erreicht den Server von Tideline nie.
-
Test-Nutzlast erstellen
Der Viewer fügt alles, was die Notiz enthält, als HTML in die Seite ein. Deshalb schreibt Bob eine Notiz, die keine echte Notiz ist: ein Bild-Tag mit einer nicht ladbaren Quelle und einem onerror -Handler. Wenn das Bild nicht geladen werden kann, läuft der Handler und jeder darin enthaltene Code wird im Browser aller ausgeführt, die den Link öffnen. Zunächst nutzt er den einfachsten möglichen Nachweis, ein schlichtes alert(1) , um zu bestätigen, dass sein Code überhaupt läuft.
-
Nutzlast testen
Bevor Bob die Nutzlast bewaffnet, öffnet er seinen eigenen Link in der Vorschau, um zu prüfen, ob sie ausgelöst wird. Die Vorschau öffnet die Notiz genau so, wie Empfänger sie sehen würden. Sobald der Viewer sie lädt, erscheint der Dialog. Sein Code läuft im Browser, genau wie geplant.
-
Machen Sie sie zur Waffe
Der Nachweis funktioniert, also macht Bob ihn jetzt gefährlich. Er kehrt zum Editor zurück und ersetzt den harmlosen Dialog durch eine Zeile, die das Session-Cookie des Besuchers liest – das Token, das die Anmeldung aufrechterhält. Eine echte Nutzlast würde dieses Cookie unbemerkt an seinen eigenen Server senden. Hier erscheint der gestohlene Wert als Dialog, damit Sie genau sehen, was er erfasst.
-
Senden Sie den Link an ein Opfer
Bob sendet den präparierten Link per E-Mail an Alice, eine Ingenieurin bei Tideline, die den ganzen Tag geteilte Notizen öffnet. Die Nachricht ist als Notiz vor ihrer morgendlichen Besprechung getarnt, daher hat sie keinen Grund zu zögern.
-
Eine geteilte Notiz trifft ein
Bobs E-Mail ist unterwegs. Sie verantworten den Viewer-Code des Tools zum Teilen von Notizen, und kurz vor Ihrer Besprechung um 10:00 trifft eine geteilte Notiz in Ihrem Posteingang ein. Öffnen Sie die E-Mail und anschließend die Notiz.
-
Öffnen Sie die geteilte Notiz
Nichts wirkt verdächtig, daher öffnen Sie die Notiz wie Dutzende andere auch.
-
Die Notiz stiehlt Ihre Sitzung
Sobald die Notiz geladen wurde, erschien dieses Pop-up in Ihrem Browser. Es zeigt Ihr eigenes Session-Cookie – das Token, das Ihre Anmeldung aufrechterhält. Sie haben nichts angeklickt und nichts eingegeben. Die geteilte Notiz enthielt ein Skript, das gerade Ihre Sitzung ausgelesen hat und sie direkt an einen Angreifer hätte senden können. Das ist eine vollständige Kontoübernahme durch das Öffnen eines einzigen Links.
Abdeckung der Sicherheits-Frameworks
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