IT-Sicherheit

XSS (Cross-Site Scripting) – Wie HTML-Injection funktioniert

Kevin KrögerIT-Sicherheit

XSS ist wenn ein Attacker JavaScript-Code in eine Website injiziert. Dieser Code wird dann im Browser von echten Benutzern ausgeführt. Das ist super gefährlich – die KI kann Cookies stehlen, den User impersonieren, oder Malware verbreiten.

Typen von XSS

Reflected XSS: Der Attacker sendet einen Link mit malicious Code in der URL: ``` https://example.com/search?q=<script>alert('hacked')</script> ``` Die Website nimmt den `q` Parameter und gibt ihn in der Response zurück: ```html <h1>Suchergebnisse für: <script>alert('hacked')</script></h1> ``` Der Browser interpretiert das `<script>` Tag und führt den Code aus. Stored XSS: Der Attacker speichert bösen Code in der Datenbank (z.B. in einem Comment). Jedes Mal wenn jemand die Page mit dem Comment besucht, wird der Code ausgeführt. Das ist schlimmer als Reflected XSS, weil es persistent ist. DOM-based XSS: Der Code wird im JavaScript ausgeführt (nicht auf dem Server). Beispiel: ```javascript document.getElementById("output").innerHTML = location.hash.substring(1); ``` Wenn die URL `#<img src=x onerror="alert('xss')">` ist, wird der Code ausgeführt.

Auswirkungen

Was kann ein Attacker mit XSS tun? 1. Cookies stehlen: Bekomme das Session Cookie und impersoniere den User 2. User umleiten: Redirect den User zu einer Phishing-Seite 3. Formular-Data stehlen: Stehle was der User in ein Formular eingibt 4. Malware verbreiten: Lade Malware oder sketchige Scripts 5. Fake Content anzeigen: Zeige fake "Du musst zahlen" Messages Das ist ernst.

Wie man sich schützt

1. Output Escaping: Wenn du Benutzer-Input anzeigst, escape ihn: ```python # FALSCH – XSS: html = f"<h1>{user_input}</h1>" # RICHTIG: from html import escape html = f"<h1>{escape(user_input)}</h1>" ``` Das wird `<script>alert('xss')</script>` zu `&lt;script&gt;alert('xss')&lt;/script&gt;`, was es als Text anzeigt, nicht als Code. 2. Content Security Policy (CSP): Ein HTTP Header der sagt, welche Scripts erlaubt sind: ``` Content-Security-Policy: script-src 'self' ``` Das sagt: Nur Scripts von meiner eigenen Domain sind erlaubt. Externe Scripts sind blockiert. 3. Nutze moderne Frameworks: React, Vue, Angular – diese escapen User-Input by default. Das schützt dich vor vielen XSS-Attacken. ```javascript // React – Safe by default: const App = () => { const userInput = "<script>alert('xss')</script>"; return <h1>{userInput}</h1>; // Wird als Text angezeigt, nicht ausgeführt }; ``` 4. Input Validation (nicht ausreichend, aber hilft): Validiere Input auf dem Server. Aber das ist nicht die Hauptverteidigung – Output Escaping ist.

Häufiger Fehler: innerHTML statt textContent

```javascript // FALSCH – XSS: document.getElementById("output").innerHTML = user_input; // RICHTIG: document.getElementById("output").textContent = user_input; ``` `innerHTML` interpretiert HTML. `textContent` gibt es als reine Text.

Fazit

XSS ist zu 80% preventable durch simple Output Escaping. Die Regel: Benutzer-Input, der angezeigt wird, muss escaped sein. Punkt.

Häufige Fragen