XSS 攻击基于输入变成最终用户浏览器的输出这一事实。最常见的攻击基本上是一个 PHP 站点,其中包含
<?php
echo $_GET["message"];
?>
然后,您将向该 URL 传递一个包含 javascript 代码的参数。如果要进行设置,something.php请在 Web 服务器上创建一个文件,将上述代码输入其中,然后http://your-server/something.php?message=<script>alert('XSS');</script>在浏览器中访问。然后它应该显示一个包含 XSS 的弹出窗口。
在静态 HTML 页面中,这是不可能的,因为它仅根据服务器的静态 HTML 代码生成内容。XSS 需要包含用户提供的代码。例外情况是,如果 html 加载易受攻击的 javascript 代码,则允许用户提供输入。
XSS 的主要目的是攻击者希望将 HIS 代码包含到您的网站中,而不是实际入侵 Web 服务器。这只有在服务器端编程语言中才有可能,它会输出一些东西,攻击者之前将其放入服务器中。
基本上,黑客希望 HTML 像这样查看浏览器
<html><body>Foo<script>alert('XSS');</script></body></html>
代替
<html><body>Foo</body></html>
以论坛或文章评论为例。应该允许用户留下他的评论。服务器需要保存它并向其他用户呈现相同的评论。如果评论本身包含 javascript 代码并且服务器程序没有缓解这种情况,它将输出相同的代码作为评论块的一部分。
至于什么时候在浏览器中加载,这个不好回答。这取决于黑客代码在页面正文中的位置或随后加载的 javascript 文件中的位置。如果它作为 javascript 标签包含在主 HTML 中,它将在 DOM 加载完成后加载。特别是如前所述,XSS 漏洞也可能发生在 javascript 文件中(该文件接受用户输入,例如 URL 并加载它)。在这种情况下,无法确定代码何时执行。您可以将此 javascript 代码绑定到按钮、文本框 onblur() 事件或计时器。
编辑:
详细说明 javascript 攻击,这是您将放入服务器文件的内容
<html><body>
<script type="text/javascript">
var queryDict = {};
location.search.substr(1).split("&").forEach(function(item) {queryDict[item.split("=")[0]] = item.split("=")[1]});
document.write(decodeURIComponent(queryDict["message"]));
</script>
</body></html>
前两行基本上采用所有 GET 参数并将它们拆分为一个数组(取自此处)。然后第三行简单地将其输出到 HTML 页面中。当然,这也可以通过执行代码中的任何其他 DOM 操作来完成。