0x00 背景
WebViews在Android应用程序中用于在应用程序中加载内容和HTML页面。由于此功能,WebView的实现必须是安全的,以免引入应用程序的巨大风险。本文的目的是检查将使WebView不太安全的事情,从而检查应用程序本身。开发人员和渗透测试人员在进行移动渗透测试时都可以使用本文作为参考。
0x01 中间人攻击 加载明文内容
如果WebView允许从Internet加载明文内容,那么它将对各种形式的攻击开放,例如MiTM。
myWebView.loadUrl("http://www.droidsec.org/tests/addjsif/");
下面的代码指示WebView客户端在发生SSL错误时继续。这意味着应用程序容易受到MiTM攻击,因为它可能允许攻击者读取或修改向用户显示的内容,因为应用程序将接受任何证书。
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error)
{
handler.proceed();
}
0x02 启用JavaScript
风险点:
允许通过WebView在应用程序中执行JavaScript内容可能使攻击者有机会执行任意JavaScript代码以执行恶意操作。此设置允许WebView执行JavaScript代码。
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
该JavascriptInterface功能允许JavaScript代码和本地Java代码之间的桥接。这意味着JavaScript代码可以访问和注入要由JavaScript调用的Java对象和Java代码。根据应用程序的权限,这可能允许攻击者与设备的功能(读取SMS,麦克风录制等)进行交互,从而使应用程序的安全性和设备本身面临巨大风险。
WebView webView = new WebView(this);
setContentView(webView);
...
class JsObject {
private String sensitiveInformation;
...
public String toString() { return sensitiveInformation; }
}
webView.addJavascriptInterface(new JsObject(), "injectedObject");
webView.loadData("", "text/html", null);
webView.loadUrl("http://www.example.com");
检测思路:
<script type=”text/javascript”>
function check()
{
for (var obj in window)
{
try {
if (“getClass” in window[obj]) {
try{
window[obj].getClass();
document.write(‘<span style=”color:red”>’+obj+'</span>’);
document.write(‘<br />’);
}catch(e){
}
}
} catch(e) {
}
}
}
check();
</script>
保存为html文件后用浏览器访问
原理:遍历所有window的对象,然后找到包含getClass方法的对象,如果存在此方法的对象则说明该接口存在漏洞。
安全加固建议:移除容易出现问题的接口
removeJavascriptInterface(“accessibility”);
removeJavascriptInterface(“accessibilityTraversal”);
removeJavascriptInterface(“searchBoxJavaBridge_”);
0x03 跨域 访问本地资源
参考:http://blogs.360.cn/post/webview%E8%B7%A8%E6%BA%90%E6%94%BB%E5%87%BB%E5%88%86%E6%9E%90.html
如果WebView允许从同一设备上存在的其他应用程序访问内容,则攻击者可能会创建恶意html文件,该文件可以通过use file:scheme注入目标应用程序内部。为了加载这个恶意文件需要具有世界可读权限。
public class MyBrowser extends Activity {
@override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WebView webView = (WebView) findViewById(R.id.webview);
// turn on javascript
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
String turl = getIntent().getStringExtra("URL");
webView.loadUrl(turl);
}
}
安全加固建议:WebView由于它的功能可以暴露应用程序和设备,因此存在很大的安全风险。移动渗透测试人员应在进行时检查以下方法及其状态,并进行机器人评估以识别相关风险。
setAllowContent访问
setAllowFileAccess
setAllowFileAccessFromFileURLs
setAllowUniversalAccessFromFileURLs
setJavaScriptEnabled
代码示例来自以下网站:
https://github.com/jduck/VulnWebView/
https://www.securecoding.cert.org/confluence/display/android/DRD02J.+Do+not+allow+WebView+to+access+sensitive+local+resource+through+file+scheme
0x04 安全加固建议
参考
https://labs.mwrinfosecurity.com/blog/webview-addjavascriptinterface-remote-code-execution/
https://www.rapid7.com/db/modules/exploit/android/browser/webview_addjavascriptinterface
webviews csp
http://www.nuckingfoob.me/android-webview-csp-iframe-sandbox-bypass/index.html
1.Android 4.3之前的版本(Jelly Bean)
WebView使用基于Apple Webkit(Safari浏览器背后的相同技术)的代码。Android的更高版本中修复了一些开放的JavaScript漏洞。
2.Android 4.4(奇巧)
WebView基于Chromium(使用Google的Blink引擎的Google Chrome的开源基础)。上面提到的JavaScript漏洞是固定的。
3.Android 5.0(棒棒糖)
WebView被拆分为一个单独的应用程序(以允许通过Google Play进行更新而无需进行固件更新)。
Android为开发人员提供了一种更精细的方式来控制传入和传出WebView的请求。诸如ClientCertRequest之类的类使我们可以选择客户端证书,以便我们可以执行SSL固定(必须具备)。
安全浏览:WebView结合了Google的安全浏览保护功能,可以检测并警告用户有关潜在危险站点的信息。
4.Android 7.0(牛轧糖)
正如 Graham Smith在他的评论中指出的那样,Android 7.0添加了 Network Security Config,您可以使用它在声明性配置文件中自定义网络安全设置(无需修改应用程序代码)。由于它也可以与WebViews一起使用,因此是执行SSL固定的一种简单方法。
5.Android 8.0(奥利奥)
WebView的渲染器在独立于主机应用程序的独立进程中运行。除了防止崩溃影响主机应用程序外,它还可以访问有限数量的资源。
6.Android 8.1(奥利奥)
Android 5.0添加了Google的安全浏览保护。现在,您可以以编程方式定义您的应用如何响应已知威胁。
针对Android 4.3及更低版本启用JavaScript的WebViews安全问题
WebView组件涉及的主要漏洞是不安全的直接对象引用,SQL注入和跨站点脚本(XSS)。
虽然这三个都是潜在的巨大风险,但是XSS潜在的漏洞可以用来通过使用file:///命令来访问共享的首选项文件,或者可以利用smsJSInterface.launchSMSActivity从电话中发送不需要的SMS消息,以及窃取凭据。或为HTML,CSS,Java脚本或其他浏览器级别的行为提供虚假的信息。
资源
这会影响到您吗?如果您的应用程序托管在您自己的服务器上,则只要没有恶意代码感染该应用程序,并且您不重定向到外部网站,都应该不错。
7.如何使WebView安全?
如果您希望WebView中的内容是安全的,建议您minSdkVersion至少将Android 5.0(API级别21)提高到安全级别,并在其中进行重大改进。
如果不需要JavaScript并将其禁用,则不必担心这些安全问题。如果您需要它,如果您控制WebView上显示的所有内容,并且认为服务器足够安全,没有人可以对其进行修改,则可以使用较低版本,尽管我强烈建议使用SSL固定(在Lollipop,Android 5.0中)。
0x05参考
https://www.zhaokeli.com/article/8066.html