Cross Site Scripting (XSS)

Cross-Site Scripting (XSS) – Grundlagen

  • Kontext
    • Webanwendung erzeugt aus Benutzereingaben HTML-Seiten
  • Schwachstelle
    • Daten werden nicht korrekt validiert
    • Ausgaben werden nicht korrekt gefiltert und encodiert
  • Angriff
    • Angreifer injiziert JavaScript in die Webseite
    • JavaScript wird von Besuchern in ihren Browsern ausgeführt
    • JavaScript greift den Browser des Besuchers an
  • Ergebnis
    • Diebstahl von Passwörtern
    • Denial-of-Service (DoS)
    • Modifikation der Webseite
    • Ausführung von Kommandos auf dem System des Benutzers

Zwei Arten von XSS

Nicht-persistent / reflektiert

  • Häufigster Angriff
  • JavaScript wird injiziert und direkt zurückgegeben
  • Angriff trifft denselben Benutzer, der JavaScript injiziert hat

Persistent

  • Etwas seltenere Form von XSS
  • JavaScript wird injiziert und auf dem Server gespeichert
  • Angriff trifft alle Benutzer, die infizierte Seite später besuchen

Beispiel: XSS anfällige Seite

<?php
  $suchbegriff = $_GET["q"];
?>
<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type"
      content="text/html; charset=UTF-8">
<head><title>XSS</title></head>
<body>
Letzter Suchbegriff: <?= $suchbegriff ?><br/><br/>
<form>
Suche: <input type="text" name="q"><input type="submit">
</form>
</body>
</html>

Was passiert, wenn man den folgenden Link anklickt?

http://www.example.com/xss.php?q=%3Cscript+type%3D%22text%2Fjavascript
%22%3Edocument.body.style.backgroundColor%3D%22red%22;alert%28%22Boom
%22%29;%3C%2Fscript%3E

Was passiert, wenn man den folgenden Link anklickt?

http://www.example.com/xss.php?q=%3Cscript+type%3D%22text%2Fjavascript
%22%3Edocument.body.style.backgroundColor%3D%22red%22;alert%28%22Boom
%22%29;%3C%2Fscript%3E

Dekodiert

http://www.example.com/xss.php?q=<script type="text/javascript">
document.body.style.backgroundColor="red";alert("Boom");</script>

XSS: Schadenspotential

  • Zugriff auf Credentials des Benutzers
    • Cookies
    • Benutzername und Passwort
  • Bei normalen Benutzern
    • Zugriff auf persönliche Daten (Kreditkarte, Bankkonto, …)
    • Zugriff auf Geschäftsdaten (Kundendaten, Angebote, …)
    • Missbrauch des Accounts (Bestellungen)
  • Bei Administratoren
    • Kontrolle über die Web-Anwendung
    • Kontrolle über den Web-Server
    • Zugriff auf Datenbank oder Backend-System
  • Denial-of-Service-Agriff
    • Browser crash
    • Pop-Up-Flut
  • Webseite verunstalten oder missbrauchen
    • Veränderung der Seite über das DOM
    • Fremde Inhalte nachladen
    • Angriffe gegen Besucher führen
    • Download von Schadprogrammen

XSS: Gegenmaßnahmen

Grundlegender Ansatz

  • Eingaben filtern
    • Unerwünschte Zeichen ausfiltern
    • Nur erwünschte Zeichen akzeptieren (Whitelist)
  • Eingaben validieren
    • Beim Auftreten von unerwünschten Zeichen den Request ablehnen
  • Ausgaben encodieren
    • Sonderzeichen so encodieren, dass sie keinen Schaden anreichten können

Beispiel: Ausgaben encodieren

<?php
  $suchbegriff = strip_tags($_GET["q"]);
  $ausgabe = htmlspecialchars($suchbegriff);
?>
<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head><title>XSS Fixed</title></head>
<body>
Letzter Suchbegriff: <?= $ausgabe ?><br/><br/>
<form>
Suche: <input type="text" name="q"><input type="submit">
</form>
</body>
</html>

Copyright © 2025 Thomas Smits