Wie Anders sagt: Blender macht einen sehr guten Punkt in Bezug auf Authentifizierungsdialoge, und multithr3at3d hat Recht mit den on-Attributen. Darüber hinaus fügt Anders Argumente über das a
-Tag hinzu und Matija hat einen guten Link zum Ausnutzen von Bibliotheken, die das Rendern ausführen.
Dennoch niemand Ich habe bereits über SVG gesprochen.
Nehmen wir zunächst an, dass alle Ein- und Ausgaben ordnungsgemäß bereinigt sind, sodass Tricks mit onerror
/ onload
möglich sind nicht möglich. Und dass wir nicht an CSRF interessiert sind. Wir sind hinter XSS her.
Das erste Problem mit <img src =
ist, dass es nicht der gleichen Ursprungsrichtlinie folgt. Aber das ist wahrscheinlich weniger gefährlich als es sich anhört.
Was der Browser tut, um ein < img >-Tag zu rendern
< img src = "http: // domain / image .png ">
ist ziemlich sicher, da der Browser keinen Parser (z. B. einen XML- oder HTML-Parser) aufruft und weiß, dass ein Bild (gif, jpeg, png) kommt.
Der Browser führt die HTTP-Anforderung aus und liest einfach die MIME des Eingangs (im Header Conetent-Type
, z. B. image / png
). Wenn die Antwort keinen Inhaltstyp
enthält, erraten mehrere Browser basierend auf der Erweiterung, raten jedoch nur Bild-MIMEs: image / jpeg
, image / png
oder image / gif
(tiff, bmp und ppm sind zweifelhaft, einige Browser unterstützen sie möglicherweise nur eingeschränkt). Einige Browser versuchen möglicherweise sogar, das Bildformat anhand magischer Zahlen zu erraten, versuchen jedoch nicht, esoterische Formate zu erraten.
Wenn der Browser mit dem (möglicherweise erratenen) MIME übereinstimmen kann, wird das richtige Rendering geladen Bibliothek, Rendering-Bibliotheken können einen Überlauf haben, aber das ist eine andere Geschichte. Wenn das MIME nicht mit einer Bildwiedergabebibliothek übereinstimmt, wird das Bild verworfen. Wenn der Aufruf der Rendering-Bibliothek fehlschlägt, wird das Bild ebenfalls verworfen.
Der Browser befindet sich niemals in der Nähe eines Ausführungskontexts (Skriptkontexts). Die meisten Browser geben den Ausführungskontext nur über den Javascript-Parser ein und können den Javascript-Parser nur über die -Anwendung / Javascript
MIME oder über den XML- oder HTML-Parser erreichen (da sie möglicherweise eingebettete Skripte haben).
Um XSS auszuführen, benötigen wir einen Ausführungskontext. Gibt SVG ein.
Verwenden von < img src = "domain / blah / blah / tricky.svg" >
Autsch, autsch autsch. SVG ist ein XML-basiertes Vektorgrafikformat und ruft daher den XML-Parser im Browser auf. Darüber hinaus hat SVG das <script>
-Tag! Ja, Sie können Javascript direkt in SVG einbetten.
Dies ist nicht so gefährlich, wie es zunächst klingt. Browser, die SVG in <img>
-Tags unterstützen, unterstützen keine Skripterstellung im Kontext. Idealerweise sollten Sie SVG in <embed>
oder <object>
-Tags verwenden, bei denen die Skripterstellung von Browsern unterstützt wird. Tun Sie dies jedoch nicht für vom Benutzer bereitgestellte Inhalte!
Ich würde argumentieren, dass das Zulassen von SVG in <img src =
gefährlich sein kann:
-
Ein XML-Parser wird verwendet, um die SVG zu analysieren, unabhängig davon, ob sie sich im Tag <img>
oder <object>
befindet. Der Parser ist sicherlich mit einigen Parametern optimiert, um <script>
-Tags im <img>
-Kontext zu ignorieren. Das ist jedoch ziemlich hässlich, da ein Tag in einem bestimmten Kontext auf die schwarze Liste gesetzt wird. Und Blacklisting ist eine schlechte Sicherheit.
-
<script>
ist nicht der einzige Weg, um einen Ausführungskontext in SVG zu erreichen, es gibt auch den onmouseover
(und Familien-) Ereignisse in SVG. Dies ist wiederum schwierig auf die schwarze Liste zu setzen.
-
Der XML-Parser in Browsern hatte in der Vergangenheit Probleme, insbesondere bei XML-Kommentaren zu Skriptblöcken. SVG kann ähnliche Probleme aufweisen.
-
SVG unterstützt XML-Namespaces vollständig. Wieder Autsch. xlink: href
ist ein vollständig gültiges Konstrukt in SVG und der Browser im XML-Parser-Kontext wird ihm wahrscheinlich folgen.
Ja, SVG wird geöffnet mehrere mögliche Vektoren, um einen Ausführungskontext zu erreichen. Darüber hinaus ist es eine relativ neue Technologie und daher nicht gut gehärtet. Es würde mich nicht wundern, CVEs zur SVG-Handhabung zu sehen. Zum Beispiel hatte ImageMagick Probleme mit SVG.