【问题标题】:What is Cross Site Script Inclusion (XSSI)?什么是跨站点脚本包含 (XSSI)?
【发布时间】:2020-06-02 19:06:07
【问题描述】:

我最近在多个页面上看到了 XSSI,例如Web Application Exploits and Defenses:

浏览器阻止一个域的页面读取其他域的页面。但它们不会阻止域的页面引用其他域中的资源。特别是,它们允许从其他域渲染图像并从其他域执行脚本。包含的脚本没有自己的安全上下文。它在包含它的页面的安全上下文中运行。例如,如果 www.evil.example.com 包含托管在 www.google.com 上的脚本,则该脚本在 evil 上下文中运行,而不是在 google 上下文中。因此,该脚本中的任何用户数据都会“泄露”。

我看不出这在实践中会产生什么样的安全问题。我了解 XSS 和 XSRF,但 XSSI 对我来说有点神秘。

任何人都可以绘制基于 XSSI 的漏洞利用吗?

谢谢

【问题讨论】:

标签: xss security


【解决方案1】:

如果您使用 JSONP 传输数据,这通常是一个问题。考虑一个由域 A 组成的网站,该网站从域 B 加载数据。用户必须通过站点 A 和 B 的身份验证,并且因为同源策略阻止旧浏览器直接与当前页面不同的域 (B) 通信(A)、开发者决定使用 JSONP。所以站点 A 包含一个指向 http://B/userdata.js 的脚本,类似于:

displayMySecretData({"secret":"this is very secret", ...})

所以 A 定义了一个名为 displayMySecretData 的函数,当服务器 B 中包含的脚本运行时,它会调用该函数并向用户显示秘密数据。

现在邪恶的服务器 E 出现了。它看到 A 正在使用 JSONP 包含来自 B 的数据。因此,服务器 E 包含相同的脚本,但定义了自己的 displayMySecretData,它会窃取数据。 然后攻击者诱使用户访问他的网站。当用户去那里并登录到 B 时,浏览器会自动发送 B 的身份验证 cookie 以及从 B 获取脚本的请求。 B 看到经过身份验证的用户,因此按预期返回脚本。 E 获取数据,然后 presto...

以这种方式使用 JSONP 从不同域加载机密数据确实不安全,但人们仍在使用它。坏主意!

【讨论】:

  • 这不是这个漏洞利用的唯一方法,但它的作用很好。
  • 似乎不清楚 E 是如何突然出现的。它是如何介绍的?有人可以澄清一下吗?
  • E 由攻击者在他们选择的主机名上设置。
【解决方案2】:

XSSI 不限于 jsonp 响应。在某些浏览器中,您可以覆盖 Array 构造函数。如果 Json 响应包含 [...] 并且您将其作为脚本包含,它将执行新的构造函数而不是内置构造函数。解决方法是在响应中插入一些无法解析的内容,例如])}while(1);</x>,然后在解析之前使用代码将其删除。攻击者无法做到这一点,因为脚本包含始终是整个脚本。

有关问题和此解决方案的更多详细信息,请访问http://google-gruyere.appspot.com/part3#3__cross_site_script_inclusion

【讨论】:

  • > 在某些浏览器中这是关键部分,在这种情况下只有古老的浏览器容易受到攻击。另外,如果您的 JSON 始终是根对象,那么它就不容易受到攻击。
  • 这个答案已有多年历史,此时所有浏览器都已修补。真的。没有人运行过旧的浏览器。错误的。人们仍然在运行 Windows XP,而且它已经报废并且多年未打补丁。这些系统上的浏览器也是如此。如果用户的浏览器是最新的,那么在此处实施建议是无害的。 (并且回复:“根处的对象”在 Javascript [] instanceof Object 中不易受到攻击。Json 定义忽略了约定,并将大多数人所说的地图或字典称为“对象”。我尽量避免这种用法,因为它是容易让人误解。)
【解决方案3】:

XSSI 是一种奇特的说法:你在你的程序中包含了别人的代码;您无法控制该代码中的内容,也无法控制托管它的服务器的安全性。

例如,假设我包含在我的 html 页面中

<script type="text/javascript" src="http://mymatedave.com/js/coolwidget.js"></script>

该脚本将在我的 web 应用程序中运行,具有与我自己的任何 javascript 代码相同的信任级别。它将可以访问整个页面内容和 DOM,它将能够读取我所有应用程序的 cookie 并读取用户的按键和鼠标移动,以及 javascript 可以做的所有其他事情。

如果我的伙伴 dave 决定在他酷炫的小部件中放入一些恶意的东西(例如,一个将所有用户的 cookie、表单数据和按键发送到他的服务器的嗅探器/键盘记录器),那么我不一定知道。此外,我的应用程序的安全性现在取决于 dave 服务器的安全性。如果 dave 的服务器遭到入侵,并且 coolwidget.js 被攻击者替换,我也不一定知道,恶意代码将作为我的应用程序的一部分运行。

【讨论】:

  • 这一切都是真的,但这并不是人们所说的 XSSI 的意思。在 XSSI 中,包含脚本的页面是恶意的,脚本本身就是受害者。 Erlend 的回答是准确的(就它而言;它只涵盖了利用包含机密信息的 JavaScript 文件的一种方法)。
  • 被称为跨站点脚本包含 (XSSI) 的漏洞是一种跨站点攻击,旨在将目标站点提供的脚本中的敏感数据泄露给经过身份验证的用户。这个答案不是关于 XSSI。