利用Window.Opener绕过CSRF保护

Posted 黑白之道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用Window.Opener绕过CSRF保护相关的知识,希望对你有一定的参考价值。

【新朋友点击标题下面蓝字「黑白之道」关注

老朋友点击右上角,分享或收藏本页精彩内容

 

  随着Web应用的流行,安全问题日益受到瞩目。目前Web应用的安全性更多依靠Web开发人员来保障,而非依靠客户端验证机制。这使得Web应用变的更加灵活可靠,但同时也伴随着高昂的代价。目前70%的Web应用都非常脆弱,正是由于基于客户端的认证机制非常容易被绕过。日前,我在一项Web应用中,发现了一个有趣的防范CSRF攻击的安全机制。


  1.简介

  当我们谈论CSRF防护时,通常会使用三种方法:

  1.检查Referrer

  2.基于表单的随机Token

  3.基于Cookie的随机Token

  目前我们进行的CSRF防护多是使用javascript代码在客户端进行防护的。


  2.分析

  我们来看一个HTTP头

  

  由于没有使用随机Token,我们可以说上面这段代码存在CSRF威胁。为了验证这点,我创建了一个html页面:

  利用Window.Opener绕过CSRF保护

  当我使用一个合法的会话去执行这个页面的时候,Web应用立即踢出了我,之后我反复尝试重新执行,Web应用均立即踢出了我并注销了我的会话。我猜想可能是Web使用了Referrer进行验证,所以我手动增加了一个合法的Referrer值,结果Web应用再次注销了我的会话。


  在经历了数次尝试之后,我发现了一段用来防护的JavaScript代码

  利用Window.Opener绕过CSRF保护

  我们发现这段代码请求了一个Window.opener值。如果Window.opener的值为空,则Web应用则会踢出我并注销我们的会话。就CSRF防护来说,这段代码相当不错。关于Window.opener请参见:Windows Opener Description


  当一个窗口由另一个窗口打开时,这个窗口会维护一个指向前一个窗口的参考值,这个值就是window.opener。如果当前窗口没有由其他窗口来打开,那么window.opener值为空。目前Windows Phone浏览器不支持window.opener,同时当窗口由不同安全区域的窗口来打开时,IE浏览器也不支持window.opener。


  那么现在我们就需要设置window.opener来实现CSRF攻击。


  3.利用

  通过分析我找到了一种通过使用HTTP标签中href属性来创建Opener值的方法。

  首先创建两个页面

  1.xss.php

  2.csrf3.html

  1.这两个页面都存在于受攻击的Web服务器上,暂且假设为"localhost"

  在"xss.php"中我创建了一个指向"csrf3.html"的链接,同时使用get方法传递一个名为"zip"的变量。这里我们假设zip变量没有进行任何过滤。那么我们使用href进行如下注入:

  href="http://127.0.0.1/csrf3.html">Link For Target Application

  2.对于csrf3.html我们使用之前的代码

  利用Window.Opener绕过CSRF保护

  最终我们发向目标的URL为

  http://127.0.0.1/xss.php?zip= href="http://127.0.0.1/csrf3.html">Link For Target Application

  效果截图如下:

利用Window.Opener绕过CSRF保护

  3.现在我成功了,在检查过href给的链接后,我可以打开新的页面而不被Web应用踢出了,同时也绕过了CSRF的防护。


  4.结论

  就像我们平时常说的基于客户端的验证机制不是一个很好的方法。经过这次实验,我想说使用新的方法去防护Web应用攻击是非常不错的,但我们必须要注意具体的实现方式。

  

----------------------------------

要闻、干货、原创、专业
关注“黑白之道” 微信:i77169
华夏黑客同盟我们坚持,自由,免费,共享!


以上是关于利用Window.Opener绕过CSRF保护的主要内容,如果未能解决你的问题,请参考以下文章

如何绕过 window.opener 跨域安全

绕过Facebook CSRF保护——导致帐户接管

6种方法绕过CSRF保护

绕过 XHR 的 CSRF 保护是不是安全? (导轨)

如何绕过csrf保护,并在burp suite中使用intruder?

react利用window.opener在同一个窗口里面传递参数