为什么这个 XSS 不起作用?

信息安全 xss
2021-08-24 10:53:13

我正在学习 DOM XSS,我有这个代码:

<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> 

但我不明白为什么这个有效载荷不会触发任何 XSS:

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

看起来符号被编码了,我不明白为什么......

我从https://www.owasp.org/index.php/DOM_Based_XSS获取了脚本,所以我猜它很容易受到攻击,但我不知道如何利用它......

1个回答

它不起作用,因为有效负载是 URL 编码的。

如果您导航到

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

您将在 URL 栏中看到文字字符<>",但浏览器实际上已请求

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

. 也就是说,您的浏览器总是对查询字符串中的某些字符进行 URL 编码,包括引号和尖括号。

因此,如果您location.href通过 JS 访问,则示例中的有效负载将返回为

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

. 这不会产生任何 HTML 标记,除非您先对其进行 URL 解码。

注意:据我所知,所有现代浏览器现在都以这种方式运行,但从历史上看,一些实现对location接口具有隐式 URL 解码值。在这些浏览器中,您的攻击会奏效。