基于 Dom 的 XSS 在现代浏览器中仍然是一个有效的安全问题吗?

信息安全 网页浏览器 xss dom
2021-08-24 04:17:23

我试图了解基于 DOM 的 XSS 是如何工作的,例如从这篇文章中,我设法在 IE11 中重现了它,但例如 Chrome 和 Firefox 至少对这个确切的例子免疫。

发生的事情是,document.baseURI类似的对象确实返回了一个编码的字符串,所以除非你明确地编写代码来解码它,或者我看不出它是如何被滥用的。

还有其他现代浏览器仍然容易受到攻击的例子吗?我没有找到任何东西,因为几乎所有网络上的例子都指向一个类似的漏洞。

PS 该示例的要点是使用注入形成一个 hashbang 查询:

http://victim/displayHelp.php?title=FAQ#<script>alert('Hello')</script>
1个回答

是的,基于 DOM 的 XSS 仍然是一个问题。虽然由于 URL 编码而无法利用某些问题,但在许多情况下 URL 编码不会妨碍利用。

该示例的要点是通过注入形成一个 hashbang 查询

这是一个例子,但基于 DOM 的 XSS 包含所有由通过 JavaScript 不安全地处理数据而导致的 XSS 问题。

数据可以来自 URL、DOM 本身等来源。

最基本的示例,例如从任何最新的浏览器读取location.search和处理用户输入innerHTML或者.write实际上不会使用任何最新的浏览器,因为该值是 URL 编码的。

但是具有不同来源location.search或不同接收器的基于 DOM 的 XSSinnerHTML仍然可以工作,并且确实存在于现实世界的应用程序中。

可以在下面找到具有不同接收器和源的示例的不完整列表。

来源:网址

用户输入来自 URL 的基于 DOM 的 XSS 漏洞示例:

<html>
<body>
<script>
    url = new URLSearchParams(location.search);
    x = url.get('x');
    document.write(x);
</script>
</body>
</html>

攻击:

http://example.com/test.html?x=<script>alert(1)</script>

来源:DOM

以我的经验,这是最常见的一类可利用的基于 DOM 的 XSS 问题。

让我们假设一个应用程序正确地对插入到 HTML 代码中的所有用户提供的数据进行 HTML 编码。

应用程序仍会经常从 DOM 中读取用户提供的数据,然后以不安全的方式重新插入。例如:

<html>
<body>
<input type="text" id="userinput" value="&quot;><img src=x onerror=alert(1)>">
<div id="output"></div>
<script>
    userinput = document.getElementById('userinput').value;
    output = document.getElementById('output');
    output.innerHTML = "Your input was: " + userinput;
</script>
</body>
</html>

水槽:评估

有时,我们不需要">获得 XSS。一个示例是传递给的用户输入eval

<html>
<body>
<script>
    x = window.location.hash.substr(1);
    eval("var myvar = '" + x + "'");
</script>
</body>
</html>

攻击:

http://example.com/test.html#';alert(1);x='

接收器:document.write

另一个我们不需要">与它一起工作的例子document.write

<html>
<body>
<script>
    x = window.location.hash.substr(1);
    document.write("<input type='text' value='" + x + "'");
</script>
</body>
</html>
</body>
</html>

攻击:

http://example.com/test.html#test'onmouseover='alert(1)