什么是跨站点脚本包含(XSSI)?

时间:2011-11-06 16:36:22

标签: xss security

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

  

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

我没有看到这在实践中造成了什么样的安全问题。我理解XSS和XSRF,但XSSI对我来说有点神秘。

任何人都可以根据XSSI草绘漏洞吗?

由于

3 个答案:

答案 0 :(得分:43)

如果您使用JSONP传输数据,这通常是一个问题。考虑一个由域A组成的网站,该域A从域B加载数据。用户必须通过站点A和B进行身份验证,并且因为同源策略阻止旧版浏览器直接与不同的域(B)通信而不是当前页面(一),开发人员决定使用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获取数据,然后预先...

因此,使用JSONP以不同的方式加载来自不同域的机密数据是非常不安全的,但人们仍在使用它。不好的主意。

答案 1 :(得分:19)

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

有关此问题及http://google-gruyere.appspot.com/part3#3__cross_site_script_inclusion

的此解决方案的更多详细信息

答案 2 :(得分:6)

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

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

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

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

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