http://p9.qhimg.com/t0170fac5823e73d50b.png

前言


在这篇文章中,我准备跟大家分享关于漏洞CVE-2016-4758的细节信息。这个漏洞是Safari浏览器中的一个UXSS漏洞。所谓UXSS,即通用型跨站脚本攻击。目前,苹果公司已经在Safari 10中修复了这个漏洞。[苹果官方安全公告]另外,移动端的Safari浏览器并不会受此漏洞影响,因为iPhone中的Safari浏览器并不支持showModalDialog()方法。


漏洞概述


漏洞编号:CVE-2016-4758

漏洞提交者:Cure53团队的Masato Kinugawa

受影响的系统:OS X Yosemite v10.10.5,OS X El Capitan v10.11.6,以及macOS Sierra 10.12

影响范围:如果用户无意间访问了一个由攻击者精心设计的恶意站点,那么将有可能导致用户的敏感数据发生泄漏。

漏洞描述:浏览器在处理location变量时存在权限问题,进而导致了该漏洞的产生,苹果公司通过在浏览器处理过程中增加额外的权限检查来修复了这个问题。

http://p9.qhimg.com/t01e8aa24891ce7efbf.png


安全客小百科:UXSS简介


目前,几种比较常见的XSS攻击有反射型XSS、存储型XSS、DomXSS、以及mXSS(突变XSS),但是很少有人了解什么是UXSS。UXSS英文全称为Universal Cross-Site Scripting,中文即为通用型跨站脚本攻击。

http://p1.qhimg.com/t0106cac3e7d7dcc186.png

现在很多的客户端或服务器端程序在开发的过程中由于代码编写不严谨,所以直接导致网站或者Web应用中存在漏洞,而常见的XSS攻击利用的这是这些Web漏洞。XSS攻击顺利进行的先决条件是目标页面中存在安全漏洞,而直接受到攻击影响的则是漏洞页面本身的用户会话。换句话说,因为浏览器的安全保护机制,XSS攻击只能读取受感染页面的会话,而无法读取其他页面的会话信息。

UXSS和其他XSS之间的一个重要区别就在于,UXSS需要利用浏览器或者浏览器扩展中存在的漏洞来创造出XSS攻击的条件,并最终执行攻击代码。简单来说,原来我们在进行XSS攻击的时候,针对的目标是Web应用本身,这是因为Web应用本身存在漏洞,所以我们才能对其进行XSS攻击。而UXSS不同,因为UXSS需要我们通过浏览器漏洞来制作“XSS”漏洞,然后再像普通XSS那样进行攻击。


攻击的先决条件


http://p8.qhimg.com/t017212eac10b7c6a0e.png

为了成功利用这个漏洞来进行攻击,我们需要以下两个先决条件

1. 通过相对URL地址来将目标页面定向至一个加载了JavaScript脚本的页面。(例如location=”/”,window.open(“/”,”_balnk”))

2. 页面加载完毕后,页面导航也就完成了。

为了更好地方便大家理解,我专门创建了一个符合攻击条件的页面:[点我跳转

页面中加载的JavaScript脚本代码如下:

1
2
3
4
5
6
<script>
function go_top(){
 location="/index.html";
}
</script>
<button onclick=go_top()>Top Page</button>

这个页面的唯一功能就是当用户点击了初始页面中的“Top Page”按钮之后,导航至https://vulnerabledoma.in/index.html页面。我个人认为,这样的页面其实满大街都是。但是通过这个漏洞,我们就可以对目标站点进行跨站脚本攻击了。


漏洞分析


现在,让我们在页面中使用showModalDialog方法。

下面这个页面会在一个模态窗口中打开我们的目标页面:

https://l0.cm/safari_uxss_showModalDialog/example.html

界面如下图所示:

http://p9.qhimg.com/t01349ad5673c51dd57.png

点击了页面中的“go”按钮之后,得到如下图所示的页面:

http://p6.qhimg.com/t0186a5a1ee16f1e907.png

关键代码如下所示:

1
2
3
4
5
6
<script>
function go(){
 showModalDialog("https://vulnerabledoma.in/safari_uxss_showModalDialog/target.html");
}
</script>
<button onclick=go()>go</button>

当我们点击了模式窗口中的“Top Page”按钮之后会发生什么呢?按理来说,我们将会访问https://vulnerabledoma.in/index.html页面。但是Safari就是这么与众不同,Safari浏览器会将页面导航至https://l0.cm/index.html。很明显,Safari已经将页面父窗口的URL基地址和模式窗口的URL基地址弄混了。具体情况如下图所示:

http://p4.qhimg.com/t017e5eb573552383d9.png

(注:只有JavaScript导航API接口中才存在这种问题。比如说,使用<a>标签和xhr.open(“GET”,[URL])则不会出现这种问题,浏览器仍然会使用正确的URL地址。)


部署XSS攻击


Safari浏览器允许在“”URL中将目标设置为<base>标签。所以,我认为,如果我将“”URL设置为父页面的<base>标签,那么我也许就可以实现XSS攻击了。

事实证明,我的假设是正确的。最终的概念验证实例代码如下所示:演示站点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<base href="//%0A%28document.domain%29%2F/">
</head>
<body>
<script>
function go(){
 showModalDialog("http://vulnerabledoma.in/safari_uxss_showModalDialog/target.html");
}
</script>
<button onclick=go()>go</button>
</body>
</html>

如果一切顺利的话,当你点击了页面中的“Top Page”按钮之后,你将会看到一个对话窗口,如下图所示:

http://p4.qhimg.com/t0187fbbc8a265f5f1f.png

如果看到了这个窗口的话,那么就说明你的攻击成功啦!


UXSS防御方法


防御UXSS的最好方法就是持续更新计算机或者服务器中的各类软件和扩展插件版本,并且在生产环境中尽量避免安装那些不会使用到的程序。当然了,即便是做到了这些也并不意味着你可以高枕无忧了。因为当一个漏洞被发现之后,漏洞的提交、确认、修复、以及补丁发布都是需要时间的,在这段时间内,用户仍然有可能受到UXSS攻击。


总结


这篇文章主要讲述的是关于Safari浏览器UXSS漏洞的内容,这个漏洞存在于浏览器的Webkit中。我在2015年6月15日就已经将该漏洞报告给苹果公司了,但是已经过去一年多了,苹果公司直到前几天才正式宣布修复了这个漏洞。

与此前一样,如果我还发现了其他有趣的漏洞,那么我肯定会跟大家一同分享,感谢各位的阅读!