【问题标题】:Is XSS possible via an @import, and if so how? Are there ways to protect against it?是否可以通过@import 实现 XSS,如果可以,如何实现?有没有办法防止它?
【发布时间】:2013-12-09 19:33:56
【问题描述】:

我们允许通过我们的 CMS 中的自定义 CSS 编辑器使用 @import,但我想知道我们这样做是否已经暴露了潜在的安全风险,它可以用于 XSS 吗?

如果是这样,那将如何发挥作用?此外,我们如何保护自己免受此类攻击?

仅供参考,我们实际上并没有在自定义 CSS 中保留 @import 语句,而是通过 preg_replace_callback() 将它们删除,并通过 file_get_contents() 替换为它们的实际目标内容。这样 CSS 仍然可以被缓存并且不会阻止页面加载,但可能让我们有机会过滤使用的 URL,甚至是返回的内容。


编辑:

在@duskwuff 的快速教育之后,很明显提供该服务存在很多潜在问题,但看起来类似的问题和答案(此处:https://stackoverflow.com/a/5209050/1058733)表明使用 HTMLPurifier + 可以非常安全地完成它CSSTidy 清理 CSS 输入,这将在 file_get_contents() 之后和缓存之前完美地适合我们的脚本,另外在保存对象过程中也是如此。

【问题讨论】:

  • 哇!我没有答案..但如果你这么担心,你应该先问...
  • 对于它的价值,有人可以在通过 HTTP 提供的文件中放入一个实际的 @import 语句。您可能正在用其他恶意内容替换 @import
  • @Leonardo, @Brad FWIW,我在 FYI 中确实提到过,我们有机会过滤/验证返回的代码。也不是说这是一种防御,因为它们不是我选择的基准,但你可以通过他们的自定义 css 编辑器在 Wordpress 中做同样的事情,所以这不像我在重新发明新的方法来搞砸自己。事实上,由于file_get_contents(),我们过滤和验证的机会是非常独特的。

标签: php css import xss


【解决方案1】:

是的。一般来说,CSS 是不安全的——它可以通过多种方式注入 Javascript 代码,包括但不限于:

根据您网站的性质,不受限制的 CSS 还可用于通过将页面内容重新格式化为密码提示符来窃取用户的密码,或者通过重新格式化或隐藏页面的重要组件来拒绝访问该网站(例如,隐藏“登录”链接)。

除非您准备好对其进行全面解析并根据已获批准的属性和选择器的白名单对其进行验证,否则请勿让用户输入将在您的网站上使用的 CSS。

【讨论】:

  • 感谢您的快速教育和链接!我发现了一个先前的问题,它提供了使用 HTMLPurifier + CSSTidy 来清理 CSS 的示例,看起来非常彻底:stackoverflow.com/a/5209050/1058733
猜你喜欢
  • 2011-05-31
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
相关资源
最近更新 更多