是的,基于 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=""><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)