Dh grundlegende XSS-Filter verarbeitet die ausgehende Anforderung durch erste Überprüfung, wo die Anforderung generiert wurde. Ich meine für eine reflektierende XSS die Anforderung kann von Angreifern System generiert werden, um bösartige Skript zu tun. Durch die Erweiterung sollte es keinen Sinn machen, Anfragen zu prüfen, die von der gleichen Domäne stammen, da dies eine Verschwendung von Ressourcen darstellen würde.
Allerdings macht IE eine falsche Annahme, XSS kann von überall her kommen und es für jeden reflektierende XSS-Schwachstelle kann aufgrund dieser falschen Annahme ausgenutzt werden. Der IE hat die HTTP-Header-Umleitungen "location:" sowie das meta refresh HTML-Tags. Es gibt jedoch auch andere Umleitungsmethoden, die für einen Angriff genutzt werden können.
Nehmen wir nun an, dass es in unserer Zielanwendung eine einfache XSS-Schwachstelle gibt, die in der Datei xss.php-Datei:
<?php
//xss.php
print $_GET['var'];
?>
Angenommen, in der Datei redir.php wurde ein Verstoß gegen OWASP a10 gefunden.
<?php
//redir.php
print “<script>”;
print “document.location='”.htmlspecialchars($_GET['redir'],ENT_QUOTES).”'”;
print “</script>”;
?>
Der Proof-of-Concept-Exploit für eine derartige Anwendung sieht folgendermaßen aus:
http://abc.com/redir.php?redir=http%3A%2F%2Fabc.com%2Fxss.php%3Fvar%3D%253Cscript
%253Ealert%2528%2Fxss%2F%2529%253C%2Fscript%253E
Der obige Link könnte von überall her stammen, auch von einem URL-Shrinking-Service. Die XSS-Nutzlast ist die GET-Variable "var". Dieser Teil des PoCs wurde doppelt url-kodiert. Dabei wird eine spitze Klammer ">" zu "%253E". Diese Kodierung täuscht sowohl den htmlspecialchars() auf dem Server sowie den Filter des IE. Diese verschlüsselte Nutzlast wird nicht durch den Aufruf von htmlspecialchars() und würde sich bei dessen Fehlen genauso verhalten.