猫头鹰
信安舆情早知道

同源方法执行漏洞挖掘

前言

今年夏天,我在LinkedIn上的安全团队实习。在此期间,我的任务是研究一个较为新颖的安全漏洞分析它的的细节,并开发一个BurpSuite扩展用来识别有漏洞的网站。除了开发扩展,我们还希望能披露同源方法执行漏洞的更多细节以此引起人们的重视。

它是什么

SOME是同源方法执行漏洞(Same Origin Method Execution)的简称,SOME是web应用程序攻击方法中的一种,它通过强制受害者在endpoints的域上执行任意页面的脚本方法来滥用回调endpoints(主要是 Flash applets和OAuth 会话的JSONP endpoints—通常重定向到- redirect_uri)。SOME的影响类似于XSS。但是有一些重要且有区别的利用方法。虽然有局限性,但是对特定web功能/网页来说也不限制UI or HTTP 响应头。

乍一看,这个漏洞好像没有什么危害,除非攻击者可以代替用户执行页面上敏感的 Javascript 函数。例如,网站上存在一个 deleteAccount 的 Javascript 函数,那么攻击者就能够调用该函数。

攻击者还可以利用这些来操作DOM。例如,如果在网页上有一个按钮,攻击者就可以通过执行 Javascript 来点击到这个按钮:

document.firstElement.nextSiblingElement.nextSiblingElement.click

执行之后这个按钮将被点击。

漏洞利用

一个网站有时会需要用户要提供一个参数用做被执行函数的函数名,然后网站在执行对应的 Javascript 函数。JSONP允许用户传递一个回调参数给服务端,以便知道网站哪些JavaScript函数会返回数据。这是一个可能被攻击的 PHP 实例:

php

从上面的代码中可以看出,用户的输入被直接注入到了 script 标签中,JSONP(https://example.com/jsonp)会返回如下的内容:

userParam({ jsonp : data }) // where `userParam` is whatever the user specified via the earlier GET parameter

上面的示例代码也很容易受到XSS攻击和其他攻击,因为用户提交的参数没有进过过滤就直接拼接到了 Javascript 中进行执行。

在常见生产环境中,理想的方法是简历一个白名单用于安全回调函数,只接受来自用户输入中特定的字符。以防止 XSS 和其他基于 JSONP 的 Rosetta Flash 攻击,但这种方法还是不能阻止 SOME 攻击。事实上,攻击者还可能通过前文提到的方法使用内建方法来操纵 DOM,如使用 firstElementChild,lastElementChild 和 nextElementSibling,这样攻击者就可以通过使用 Javascript 方法访问到页面上任意的元素。

深入利用

如果攻击者发现一个网站应用存在 SOME 漏洞,那他们绝不会满足于浏览网页上的各个元素,如果通过使用 Javascript 内建的 window.opener 方法可以打开同源网站的其他页面。利用这种方法就可以扩展攻击面,但缺点就是需要打开多个页面。

使用 window.opener

我们需要打开多个页面来进行攻击,所以用户必须先登录到攻击者控制的页面上,攻击流程如下:

  • 用户登录到攻击者的控制的页面(简称为Window 1);
  • 从 Window 1中启动一个新窗口(简称为Window 2);
  • Window 2 是由 Window 1 通过 window.opener 打开的与攻击者控制页面同源的页面;
  • Window 1 重定向到包含按钮或者其他攻击者想执行 Javascript 方法的目标页面;
  • Window 2 使用 window.opener 方法打开与 Window 1 目标页面同源的存在SOME漏洞的页面;
  • Window 2 以 window.opener.functionToExecute 作为回调进行执行;
  • 此时,函数会在 Window 1 中被执行。

现在,攻击者就可以对同源网站进行攻击,流程图应该是这样的:

  • 1

same-origin-method-execution-diagram-1-638

  • 2

same-origin-method-execution-diagram-2-638

  • 3

same-origin-method-execution-diagram-3-638

  • 4

same-origin-method-execution-diagram-4-638

  • 5

same-origin-method-execution-diagram-5-638

攻击步骤

早些时候有人提到攻击可以被页面上额外的确认弹窗提示阻止,尽管如此,攻击者仍可以生成多个窗口来绕过检查,具体流程如下:

  • 用户登录到攻击者的控制的页面(简称为Window 1);
  • 从 Window 1中启动一个新窗口(简称为Window 2);
  • 从 Window 1中启动一个新窗口(简称为Window 3);
  • Window 2 和 Window 3 是由 Window 1 通过 window.opener 打开的与攻击者控制页面同源的页面;
  • Window 1 重定向到包含按钮或者其他攻击者想执行 Javascript 方法的页面;
  • Window 2 和 Window 3 使用 window.opener 方法打开与 Window 1 目标页面同源的存在SOME漏洞的页面;
  • Window 2 以 window.opener.buttonToClick.click 作为回调进行执行,此时 Window 1 页面上的按钮会被点击且同时弹出额外的确认弹窗;
  • Window 3 以 window.opener.buttonToConfirm.click 作为回调进行执行,以此来点击 Window 1 页面上确认弹窗的确认按钮;
  • Window 1 上的两个确认按钮均被点击,攻击完成。

一个 BurpSuite 插件

SOMEtime 是一个开源的 BurpSuite 被动式扫描插件,通过监听 HTTP的请求响应来检测目标是否存在 SOME 漏洞。插件的安装与使用请参考:https://github.com/linkedin/sometime

如何防止

  • 应用程序应尽量使用静态定义的回调值;
  • 如果你需要同时支持多个回调端点,最好的办法就是在服务端使用白名单控制回调值,只有指定的回调值才会被执行。可以通过对服务器白名单给定的回调参数值相匹配来实现。
  • 通常来说,JSONP 是一种可以用来绕过同源策略有争议的技术,如果不是必须要使用,建议使用 window.postMessage 应作为代替来完成跨域请求执行。

参考

http://www.benhayak.com/2015/06/same-origin-method-execution-some.html

跨过浏览器同源策略

*原文:Linkedin  Mottoin翻译发布

转载请注明来自MottoIN,未经允许不得转载!MottoIN » 同源方法执行漏洞挖掘

分享到:更多 ()

评论 抢沙发

评论前必须登录!

 

MottoIN 换一个角度看安全

寻求报道联系我们