是否可以通过样式表进行跨域攻击?

时间:2012-03-07 18:05:59

标签: css security xss

我需要为我的网络应用程序用户创建的网页实现灵活的样式系统。

理想情况下,我想允许他们使用CSS。是否在用户定义的网址链接到样式表错误的想法为什么的?是否可以安全地做到这一点?

你对此有何看法?我试图避免建立一个风格'编辑'。虽然使用现成的一个可能是一个选项,建议?

2 个答案:

答案 0 :(得分:5)

  

是否可以安全地完成这项工作?

取决于您如何定义"安全"。外部样式表可能会使事物看起来很丑陋,或者使用网站上现有的控制元素来玩恶作剧。你无法阻止它,因为它无法被发现。 Here可以很好地概述可以这样做的恶意事件。

另外,很明显,CSS可以通过设置background-image或类似的方式触发对任何类型的URL的请求。浏览器会注意到URL是否不是有效的图像资源,但请求将始终发生。这样,可能会引发密码提示,表明该网站的用户可能会误认为他自己的登录提示。

我通过CSS不知道任何脚本攻击向量,虽然我非常确定IE's behavior可能是一个。我肯定会删除那些。

有一个related question on Stack Overflow,但接受的答案中指出的漏洞都不适用于纯外部样式表。

答案 1 :(得分:4)

是。它可以是一个矢量。这一位livejournal

  

LiveJournal包含一个允许远程跨站点脚本攻击的漏洞。这个缺陷的存在是因为应用程序在保存之前不会在'/cgi-bin/cleanhtml.pl'脚本中验证CSS样式属性。这可以允许用户创建特制的URL,该URL将在浏览器和服务器之间的信任关系中在用户的浏览器中执行任意代码,从而导致完整性的丧失。更多信息,请访问osvdb.org/21896

Caja's Attack Vectors Wiki解释了expressionmoz-binding以及类似机制如何允许任意代码执行。

  

效果

     

精心设计的CSS样式表可以在某些浏览器上执行全局范围内的未经过验证的javascript。

     

...

     

版本

     

IE 5及更高版本(但不是IE 8或更高版本的“标准模式”)。

     

Mozilla / Firefox,版本未知。

     

实施例

<div id='oDiv' style='left:expression(alert("hello"), 0)'>
  Example DIV
</div>

node.style.cssText = 'left:expression(alert("hello"), 0)';

<input style='-moz-binding: url("http://www.mozilla.org/xbl/htmlBindings.xml#checkbox");'>

div {
  -moz-binding: url(data:text/xml;charset=utf-8,%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Cbindings%20id%3D%22xbltestBindings%22%20xmlns%3D%22http%3A//www.mozilla.org/xbl%22%3E%0A%20%20%3Cbinding%20id%3D%22xbltest%22%3E%3Ccontent%3EPASS%3C/content%3E%3C/binding%3E%0A%3C/bindings%3E%0A);
}
node.style.MozBinding = 'url("http://www.mozilla.org/xbl/htmlBindings.xml#checkbox")';
<ul>
  <li style="behavior:url(a1.htc) url(a2.htc)">List Item</li>
</ul>

  

是否可以安全地完成这项工作?

是。您可以将CSS属性列入白名单,并删除任何您认为不安全的内容。

Caja以JSON格式定义white-lists,允许使用大部分CSS,同时禁止那些可能执行代码的CSS。