WebKit XSS Filter blockt Inlineframes und Flash Objekte in der WordPress Artikelvorschau

Cross-Site-Scripting (XSS), also das Einfügen von schädlichen Skripter einer Seite A in Seite B, ist ein Sicherheitsfaktor, den es gilt zu unterbinden. Primär sind dafür die Entwickler der jeweiligen Webseite zuständig.
Doch auch heutige Browser klinken sich in die Thematik ein.

Seit geraumer Zeit besitzen WebKit Browser, siehe Chrome und Safari, einen XSS Filter, der überprüft, ob ein Skript, welches auf einer Webseite ausgeführt werden soll, sich auch schon in der POST Anfrage befand. Ist dem so, kann dies ein Indiz für eine XSS-Attacke sein und wird geblockt.

Mit folgenden Beispiel kann der XSS Filter selbst getestet werden:

<?php
if( ! $_POST ) :
?>
<form method="post">
	<input name="xss" value="<iframe src='http://example.com'></iframe>" />
	<input type="submit" />
</form>
<?php
else :
	echo $_POST&#91;'xss'&#93;;
endif;&#91;/code&#93;

<h4>Was hat das nun mit der Artikelvorschau in WordPress zu tun?</h4>
Ganz einfach: Starte Chrome oder Safari, erstelle einen Artikel mit einem YouTube Video und klicke auf den Button <em>Vorschau</em>.

Das Ergebnis:

[caption id="attachment_980" align="aligncenter" width="700"]<img src="https://dominikschilling.de/wp-content/uploads/2012/09/wordpress-preview-webkit.png" alt="WordPress Vorschau im Webkit Browser" title="Artikel Vorschau eines YouTube Videos im Webkit Browser" width="700" height="472" class="size-full wp-image-980" /> Artikel Vorschau eines YouTube Videos im Webkit Browser[/caption]

Man sucht vergeblich das YouTube Video, die Konsole wirft ein <span style="color:red">Refused to execute a JavaScript script. Source code of script found within request.</span> aus und nach einem Reload des Fensters ist das YouTube Video wieder da.

[caption id="attachment_982" align="alignright" width="256"]<img src="https://dominikschilling.de/wp-content/uploads/2012/09/wordpress-aktikelvorschau-weg.png" alt="WordPress Artikelvorschau" title="WordPress Artikelvorschau" width="256" height="388" class="size-full wp-image-982" /> Visualisierung der Artikelvorschau[/caption]

Warum? Der XSS-Filter hat zugeschlagen.

Beim Klick auf den <em>Vorschau</em> Button wird eine POST Abfrage an <code>/wp-admin/post.php</code> gestartet und intern als <code>post.php?action=preview</code> aufgenommen.

Dadurch wird erreicht, dass eventuelle Änderungen in einem Entwurf oder einer Revision (Autosave) gespeichert werden. Genaueres kann man der Funktion <code>post_preview()</code> entnehmen.

Das Wichtige an der Funktion ist die Rückgabe. Er enthält die Weiterleitung zur eigentlichen Vorschau.

Wie bekannt ist, zeigt die Vorschau eine 1:1 Kopie des Artikels samt Änderungen. Dazu zählt auch in unserem Fall der vorher per POST gesendete Artikelinhalt mit dem YouTube Video.
Wir erinnern uns zurück: Der XSS-Filter schlägt zu, wenn ein Skript in einer POST Abfrage gefunden wird und gleichzeitig vom Browser gerendert werden soll.
Trotz dem Umweges ist dies nun bei WordPress genau der Fall.

Und jetzt?

<h4>Den WebKit XSS Filter umgehen</h4>

Mit Hilfe eines nicht-standardisierten HTTP-Headerfeldes <code>X-XSS-Protection</code> kann dem Browser mitteilt werden, dass schon auf der Client-Seite für die nötige Sicherheit gesorgt wurde. Der Wert des Feldes sollte dann mit <code>0</code> belegt werden.

Folgende Zeilen setzen das Vorhaben für unsere Artikelvorschau um und sollte in einem Plugin Platz finden.

[code gist="plugin.php"]

Führt man das obige Szenarion nun erneut aus, so sollte das YouTube Video direkt angezeigt werden.

Zum Thema

Leave a Reply