导语:研究人员发现一个Safari浏览器的bug,利用该bug可以绕过浏览器的过滤器,并进行XSS。漏洞修复后又引发了新的漏洞。

研究人员发现一个Safari浏览器的bug,利用该bug可以绕过浏览器的过滤器,并进行XSS。之前也有研究人员发现过该漏洞,因此漏洞并不是第一次出现。

先看一个研究人员偶然发现脚本文件:

<script type="text/javascript">
	var parseQueryString = function parse(queryString) {
		*/
			parsing
		/*
		return params;
	}

	var search = window.location.search;
	var query = parseQueryString(search);

	var redirect = query.redirect;
	redirect = decodeURIComponent(redirect);
	
	var parser = document.createElement('a');
	parser.href = redirect;
	var protocol = parser.protocol.toLowerCase();

	if (['javascript:', 'vbscript:', 'http:', 'https:', 'data:'].indexOf(protocol) < 0) {
		window.top.location = redirect;
	}
</script>

该文件的目的是重定向到手机APP,其中有重定向参数,检查协议是否在黑名单中,如果不在黑名单中就重定向。为了成功利用该漏洞,需要创建一个可以以Javascript执行的链接,因为协议中没有javascript。根据浏览器说明文件,这是不可能的。但与其他软件一样,浏览器并不会完全遵循说明文件。

研究人员首先关注的是重定向部分。因为使用了.toLowerCase(),那么是否有可能将一些Unicode字符串在进行.toLowerCase()转化时变成其他字符呢?一个协议被分成两行是否可以正常运行呢?

重定向

研究人员选择分析重定向而不是过滤器。一般来说域名和URL-handling可能会存在漏洞,所以研究开始了分析之旅:

打开console,写一个函数来模拟绕过。

`//`在Javaccript中表示注释,`%0a`是URL编码的换行来绕过注释。

幸运的是研究人员竟然发现成功了。因为黑名单中没有指定空协议,因此可以绕过过滤器。

Final payload是:`?redirect=javascript://%0aalert(document.domain)`。

该漏洞被报告给了许多使用SaaS服务的站点,许多使用该服务的子域名都受该漏洞的影响。许多厂商都了解到了该漏洞并进行了补丁修复。

引发新漏洞的补丁

因为SaaS厂商迅速提供了安全补丁,也就是说所有受影响的网站现在都安全了。但研究人员发现该补丁会破坏页面原有的功能,因此研究人员猜测这是一个临时补丁。

几个月后,vpnMentor的write-up显示临时补丁被另一个更新的补丁代替,但这会导致新的XSS漏洞。

正则表达式

研究人员发现原来的payload还可以正常运行。第二个漏洞的补丁会导致第三个漏洞的出现,同样的payload还可以正常起作用。但这并不是一个纯DOM XSS,因为并不会在JS上读取URL参数,而是在服务端反射。

最新解决方案

修复第三个漏洞的解决方案就是在黑名单中添加:’‘ and ‘: ’。研究人员认为应该没有什么可以绕过这个黑名单的。

// App redirects only.
        if ([ 'javascript:', 'vbscript:', 'http:', 'https:', 'data:', 'ftp:', ':', ' ' ].indexOf(protocol) < 0) {
          window.top.location = validate("[injection]");
        }

该函数需要支持不同的自定义APP协议,使其不可能使用白名单,而只能使用黑名单。

总结

黑名单从来都不是一个很好的解决方案。在进行漏洞修复时需要记录漏洞出现的原因以预防漏洞再次出现。协议bug相关信息半年前就通知了苹果公司,但Mac电脑和手机设备的Safari最新版本仍存在该漏洞。

源链接

Hacking more

...