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>