反射型 XSS 脚本通过 URL 传递如何使其工作,其工作的前提条件是什么?

信息安全 Web应用程序 网页浏览器 xss
2021-08-16 00:52:04

为了了解安全性,我在我的本地主机上建立了一个最简单的网站,由一个 apache 服务器提供的 html 页面组成。我首先开始尝试将要执行的 JS 脚本附加到 URL 的末尾:
/index.html?message=<script>alert('XSS');</script>

浏览器将其编码为:

/index.html?message=%3Cscript%3Ealert(%27XSS%27);%3C/script%3E

我对这种攻击向量应该如何工作的理解是攻击者向受害者发送一个类似的 URL -> 受害者点击它 -> 脚本被执行(不确定应该在什么时候执行?)

问题:

  1. 为什么不执行?
  2. 如何让它执行?
  3. 这种攻击的先决条件是什么——也许仅仅拥有一个简单的网页是不够的?
  4. 什么时候应该执行这个脚本?DOM 加载后?

关于这应该如何工作的一般解释也将不胜感激。谢谢!

1个回答

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 操作来完成。