Unsachgemäße Neutralisierung von Eingaben während der Webseitengenerierung ('Cross-site Scripting')

Beschreibung

Cross-site Scripting (XSS) ist eine Schwachstelle, die auftritt, wenn Software benutzergesteuerte Eingaben nicht oder nicht korrekt neutralisiert, bevor sie in Ausgaben platziert werden, die als Webseite an andere Benutzer ausgeliefert werden. XSS ermöglicht Angreifern, bösartige clientseitige Skripte in Webseiten einzuschleusen, die von anderen Benutzern angezeigt werden. Es gibt drei Haupttypen: Reflected XSS (bösartiges Skript kommt aus der aktuellen HTTP-Anfrage), Stored XSS (bösartiges Skript wird dauerhaft auf dem Zielserver gespeichert) und DOM-basiertes XSS (Schwachstelle existiert in clientseitigem Code statt serverseitigem). Wenn diese Skripte im Browser eines Opfers ausgeführt werden, können sie Session-Cookies stehlen, Anmeldedaten erfassen, Aktionen im Namen von Benutzern ausführen, zu bösartigen Websites umleiten oder Seiteninhalte für Phishing-Angriffe modifizieren.

Risiko

XSS bleibt eine der verbreitetsten und gefährlichsten Webanwendungs-Schwachstellen und erscheint konstant in OWASP Top 10. Die Auswirkungen reichen von Session-Hijacking und Anmeldedatendiebstahl bis zur vollständigen Kontoübernahme und Malware-Verbreitung. Stored XSS ist besonders gefährlich, da es alle Benutzer betrifft, die den kompromittierten Inhalt ansehen, ohne dass sie auf einen bösartigen Link klicken müssen. Hochkarätige Angriffe wie der Samy-MySpace-Wurm infizierten über eine Million Profile in Stunden, während der British-Airways-Magecart-Angriff XSS nutzte, um Zahlungskartendaten von 380.000 Kunden zu stehlen, was zu einer Geldstrafe von 20 Millionen Pfund führte. XSS ermöglicht ausgeklügelte Phishing-Angriffe, die schwer zu erkennen sind, da sie von vertrauenswürdigen Domains zu stammen scheinen, und kann als Einstiegspunkt für schwerwiegendere Angriffe einschließlich Malware-Einsatz dienen.

Lösung

Implementieren Sie kontextbewusste Ausgabecodierung für alle vom Benutzer bereitgestellten Daten, bevor sie in Webseiten gerendert werden. Verwenden Sie HTML-Entity-Codierung für HTML-Body-Inhalte, JavaScript-Codierung für Daten in JavaScript, URL-Codierung für URL-Parameter und CSS-Codierung für Style-Kontexte. Setzen Sie Content Security Policy (CSP)-Header ein, um Skriptausführungsquellen einzuschränken und die Auswirkungen erfolgreicher XSS zu mildern. Verwenden Sie moderne Web-Frameworks, die Ausgaben standardmäßig automatisch escapen (React, Angular, Vue.js). Validieren und bereinigen Sie Eingaben mit Allowlists, aber erkennen Sie, dass Ausgabecodierung die primäre Verteidigung ist. Für Rich-Text-Eingaben verwenden Sie bewährte Bereinigungsbibliotheken wie DOMPurify. Setzen Sie HttpOnly- und Secure-Flags auf Session-Cookies, um Diebstahl über XSS zu verhindern. Implementieren Sie Subresource Integrity (SRI) für Skripte von Drittanbietern.

Häufige Auswirkungen

AuswirkungDetails
VertraulichkeitBereich: Vertraulichkeit

Angreifer können Session-Cookies, Access-Tokens und sensible auf Seiten angezeigte Daten stehlen. Persönliche Informationen, Finanzdaten und Anmeldedaten können auf angreifergesteuerte Server exfiltriert werden.
IntegritätBereich: Integrität

XSS ermöglicht Angreifern, Seiteninhalte zu modifizieren, gefälschte Formulare für Phishing einzuschleusen, Transaktionsdetails zu ändern oder Websites zu verunstalten. Benutzer können dazu verleitet werden, unbeabsichtigte Aktionen auszuführen.
ZugriffskontrolleBereich: Zugriffskontrolle

Session-Hijacking durch gestohlene Cookies ermöglicht vollständige Kontoübernahme. Angreifer können jede Aktion ausführen, die das Opfer ausführen kann, einschließlich Passwortänderung und Zugriff auf sensible Funktionalität.
VerfügbarkeitBereich: Verfügbarkeit

XSS-Würmer können sich schnell verbreiten und Dienstverschlechterung verursachen. Bösartige Skripte können Browser-Abstürze verursachen oder Benutzer von legitimen Diensten wegleiten.

Beispielcode + Lösungscode

Das folgende Beispiel zeigt anfällige und sichere Handhabung von Benutzereingaben in Webanwendungen:

Anfälliger Code

<!-- ANFÄLLIG: PHP mit direkter Ausgabe -->
<?php
// Reflected XSS - Benutzereingabe direkt in Antwort
$search = $_GET['q'];
echo "<h2>Suchergebnisse für: $search</h2>";

// Stored XSS - unbereinigte Daten aus Datenbank
$comment = $row['comment']; // Enthält: <script>alert('XSS')</script>
echo "<div class='comment'>$comment</div>";
?>

<!-- ANFÄLLIG: JavaScript DOM-Manipulation -->
<script>
// DOM-basiertes XSS - innerHTML mit Benutzereingabe
var userInput = window.location.hash.substring(1);
document.getElementById('greeting').innerHTML = 'Hallo, ' + userInput;

// Anfällig: Elemente mit Benutzerdaten erstellen
var name = new URLSearchParams(window.location.search).get('name');
document.write('<h1>Willkommen ' + name + '</h1>');
</script>

<!-- ANFÄLLIG: Event-Handler mit Benutzereingabe -->
<img src="x" onerror="alert('XSS')">
<a href="javascript:alert('XSS')">Klick mich</a>

Alle Beispiele sind anfällig, weil Benutzereingaben direkt in HTML-, JavaScript- oder URL-Kontexte ohne ordnungsgemäße Codierung oder Bereinigung platziert werden.

Korrigierter Code

<?php
// SICHER: Ordnungsgemäße Ausgabecodierung in PHP

// Reflected XSS-Prävention - HTML-Entity-Codierung
$search = $_GET['q'] ?? '';
$safe_search = htmlspecialchars($search, ENT_QUOTES, 'UTF-8');
echo "<h2>Suchergebnisse für: {$safe_search}</h2>";

// Stored XSS-Prävention - immer Ausgabe aus Datenbank codieren
$comment = $row['comment'];
$safe_comment = htmlspecialchars($comment, ENT_QUOTES, 'UTF-8');
echo "<div class='comment'>{$safe_comment}</div>";

// Für JavaScript-Kontext json_encode() verwenden
$user_data = $_GET['data'] ?? '';
?>

<!-- Content Security Policy Header -->
<?php
header("Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'");
?>

<!-- SICHER: JavaScript mit ordnungsgemäßer Handhabung -->
<script>
// Sicher: textContent anstelle von innerHTML verwenden
var userInput = window.location.hash.substring(1);
var sanitized = DOMPurify.sanitize(userInput);
document.getElementById('greeting').textContent = 'Hallo, ' + sanitized;

// Sicher: createElement und textContent verwenden
function displayName(name) {
    var h1 = document.createElement('h1');
    h1.textContent = 'Willkommen ' + name;  // textContent escaped automatisch
    document.body.appendChild(h1);
}

// Sicher: Ordnungsgemäße JSON-Codierung für Daten im Skript
var serverData = <?php echo json_encode($user_data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP); ?>;

// Sicher: URL-Validierung für href-Attribute
function safeLink(url) {
    try {
        var parsed = new URL(url, window.location.origin);
        // Nur http/https-Protokolle erlauben
        if (parsed.protocol === 'http:' || parsed.protocol === 'https:') {
            return parsed.href;
        }
    } catch (e) {
        return '#';
    }
    return '#';
}
</script>

<!-- SICHER: Data-Attribute anstelle von Inline-Handlern verwenden -->
<button id="actionBtn" data-action="submit">Absenden</button>
<script>
document.getElementById('actionBtn').addEventListener('click', function(e) {
    var action = e.target.dataset.action;
    // Aktion sicher verarbeiten
});
</script>

<!-- SICHER: Bild mit validierter Quelle -->
<?php
$image_url = $_GET['img'] ?? '';
// URL validieren, dass sie von erlaubter Domain ist
if (preg_match('/^https:\/\/trusted-cdn\.com\/images\/[a-zA-Z0-9_-]+\.(jpg|png|gif)$/', $image_url)) {
    echo '<img src="' . htmlspecialchars($image_url, ENT_QUOTES, 'UTF-8') . '" alt="Benutzerbild">';
}
?>

Der korrigierte Code implementiert mehrere Verteidigungsschichten: htmlspecialchars() für HTML-Kontext-Codierung, json_encode() mit ordnungsgemäßen Flags für JavaScript-Kontexte, textContent anstelle von innerHTML für DOM-Manipulation, Content Security Policy Header, URL-Validierung für Link-Attribute und DOMPurify für Fälle, in denen HTML-Eingaben erlaubt sein müssen.


Ausgenutzt in der Praxis

British Airways Magecart-Angriff (British Airways, 2018)

Die Magecart-Hackergruppe nutzte eine XSS-Schwachstelle aus, um bösartiges JavaScript in die Website und mobile Anwendung von British Airways einzuschleusen. Das 22-zeilige Skimming-Skript erfasste von Kunden eingegebene Zahlungskartendaten und übertrug sie an eine angreifergesteuerte Domain (baways.com). Der Angriff kompromittierte Daten von etwa 380.000 Transaktionen über 15 Tage und legte Namen, Adressen, Zahlungskartennummern, Ablaufdaten und CVVs offen. Der Verstoß führte zu einer DSGVO-Geldstrafe von 20 Millionen Pfund vom UK Information Commissioner's Office.

Samy MySpace-Wurm (MySpace, 2005)

Sicherheitsforscher Samy Kamkar erstellte einen Stored-XSS-Wurm, der MySpace-Profilseiten ausnutzte. Der Wurm schleuste JavaScript ein, das Kamkar automatisch als Freund hinzufügte und sich beim Ansehen auf die Profile der Opfer kopierte. Innerhalb von 20 Stunden infizierte der Wurm über eine Million Benutzerprofile und wurde damit einer der sich am schnellsten verbreitenden Viren der Geschichte. Der Angriff demonstrierte, wie XSS selbstverbreitende Malware ermöglichen kann, die massive Benutzerpopulationen betrifft.

Fortnite-Kontokompromittierung (Epic Games, 2019)

Forscher entdeckten XSS-Schwachstellen in Fortnites Authentifizierungssystem, die über 200 Millionen Benutzer hätten betreffen können. Die Schwachstellen auf einer Legacy-Seite ohne Sicherheit ermöglichten Angreifern, Authentifizierungstoken zu stehlen, auf Benutzerkonten zuzugreifen, persönliche Informationen einzusehen, V-Bucks (In-Game-Währung) mit gespeicherten Zahlungskarten zu kaufen und In-Game-Sprach-Chat abzuhören. Epic Games behob die Schwachstellen nach verantwortungsvoller Offenlegung.


Tools zum Testen/Ausnutzen

  • Burp Suite — umfassende Web-Sicherheitstestplattform mit automatisiertem XSS-Scanning, DOM-basierter XSS-Erkennung und Tools zum Erstellen und Testen von XSS-Payloads über verschiedene Kontexte.

  • XSStrike — fortgeschrittenes XSS-Erkennungstool, das Fuzzing und intelligente Payload-Generierung verwendet, um Reflected-, Stored- und DOM-basierte XSS-Schwachstellen zu entdecken.

  • OWASP ZAP — Open-Source-Webanwendungs-Sicherheitsscanner mit aktiver und passiver XSS-Erkennung, einschließlich DOM-XSS-Analyse durch Browser-Integration.


CVE-Beispiele

  • CVE-2023-28432 — MinIO Console Reflected XSS durch Fehlermeldungsbehandlung ermöglicht Session-Hijacking.

  • CVE-2023-37580 — Zimbra Collaboration Reflected XSS in Webmail-Classic-Schnittstelle, ausgenutzt in gezielten Angriffen.

  • CVE-2024-21893 — Ivanti Connect Secure Stored XSS in Admin-Schnittstelle ermöglicht Administrator-Session-Diebstahl.

  • CVE-2022-21703 — Grafana Stored XSS durch Dashboard-Annotationen betrifft Enterprise-Monitoring-Plattformen.


Referenzen

  1. MITRE. "CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')." Common Weakness Enumeration. https://cwe.mitre.org/data/definitions/79.html

  2. OWASP. "Cross Site Scripting (XSS)." OWASP Foundation. https://owasp.org/www-community/attacks/xss/

  3. PortSwigger. "Cross-site scripting." Web Security Academy. https://portswigger.net/web-security/cross-site-scripting

  4. OWASP. "XSS Prevention Cheat Sheet." OWASP Cheat Sheet Series. https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html