导语:研究人员发现一个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最新版本仍存在该漏洞。