it-swarm.com.de

Warum funktioniert dieses XSS nicht?

Ich lerne DOM XSS und habe diesen Code:

<html>
 <body>
     Select your language:
     <select>
        <script>
        document.write("<OPTION value=1>"+document.location.href.substring(document.location.href.indexOf("default=")+8)+"</OPTION>");
        document.write("<OPTION value=2>English</OPTION>");
         </script>
     </select>
 </body>
</html> 

aber ich verstehe nicht, warum diese Nutzlast kein XSS auslöst:

t.html?default=test</option><img src=x onerror=alert(1)/>

Es sieht so aus, als wären die Symbole verschlüsselt und ich verstehe nicht warum ...

Ich habe das Skript von https://www.owasp.org/index.php/DOM_Based_XSS genommen, also denke ich, dass es anfällig ist, aber ich weiß nicht, wie ich es ausnutzen soll ...

5
Neolex

Es funktioniert nicht, da die Nutzdaten URL-codiert sind.

Wenn Sie zu navigieren

https://example.com/?foo=<>"

sie werden siehe die Literalzeichen <>" in Ihrer URL-Leiste, aber der Browser hat tatsächlich angefordert

https://example.com/?foo=%3C%3E%22

. Das heißt, Ihr Browser codiert immer einige Zeichen in der Abfragezeichenfolge per URL, einschließlich Anführungszeichen und spitze Klammern.

Wenn Sie also über JS auf location.href Zugreifen, wird die Nutzlast in Ihrem Beispiel als zurückgegeben

test%3C/option%3E%3Cimg%20src=x%20onerror=alert(1)/%3E

. Dies erzeugt keine HTML-Tags, es sei denn, Sie dekodieren sie zuerst per URL.

Hinweis: Soweit ich weiß, verhalten sich alle modernen Browser jetzt so, aber in der Vergangenheit haben einige Implementierungen implizit URL-decodierte Werte für die location -Schnittstelle. In diesen Browsern hätte Ihr Angriff funktioniert.

13
Arminius