跳过内容

MASTG-TEST-0033: 测试通过 WebView 暴露的 Java 对象

此测试即将更新

此测试目前可使用,但将作为新的 OWASP MASTG v2 指南 的一部分进行全面修订。

请通过提交PR来帮助我们:MASTG v1->v2 MASTG-TEST-0033: 测试通过WebView暴露的Java对象 (android)

发送反馈

概述

要测试通过WebViews暴露的Java对象,请检查应用程序是否具有启用JavaScript的WebView,并确定WebView是否正在创建任何JavaScript接口,也称为“JavaScript桥”。最后,检查攻击者是否可能注入恶意JavaScript代码。

静态分析

以下示例显示了如何使用addJavascriptInterface来桥接WebView中的Java对象和JavaScript。

WebView webview = new WebView(this);
WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);

MSTG_ENV_008_JS_Interface jsInterface = new MSTG_ENV_008_JS_Interface(this);

myWebView.addJavascriptInterface(jsInterface, "Android");
myWebView.loadURL("http://example.com/file.html");
setContentView(myWebView);

在Android 4.2(API级别17)及更高版本中,注释@JavascriptInterface明确允许JavaScript访问Java方法。

public class MSTG_ENV_008_JS_Interface {

        Context mContext;

        /** Instantiate the interface and set the context */
        MSTG_ENV_005_JS_Interface(Context c) {
            mContext = c;
        }

        @JavascriptInterface
        public String returnString () {
            return "Secret String";
        }

        /** Show a toast from the web page */
        @JavascriptInterface
        public void showToast(String toast) {
            Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
        }
}

以下是如何从JavaScript调用方法returnString,字符串“Secret String”将存储在变量result

var result = window.Android.returnString();

通过存储的XSS或MITM攻击等方式访问JavaScript代码后,攻击者可以直接调用暴露的Java方法。

如果addJavascriptInterface是必要的,请考虑以下几点:

  • 只有APK提供的JavaScript才能使用这些桥,例如通过验证每个桥接Java方法上的URL(通过WebView.getUrl)。
  • 不应从远程端点加载JavaScript,例如,通过将页面导航保持在应用程序的域内,并在默认浏览器(例如,Chrome,Firefox)上打开所有其他域。
  • 如果出于遗留原因(例如,必须支持较旧的设备)有必要,至少在应用程序的清单文件中将最小API级别设置为17(<uses-sdk android:minSdkVersion="17" />)。

动态分析

对应用程序的动态分析可以显示加载了哪些HTML或JavaScript文件以及存在哪些漏洞。利用该漏洞的过程从生成JavaScript有效负载并将其注入到应用程序正在请求的文件开始。可以通过MITM攻击或直接修改存储在外部存储中的文件来完成注入。整个过程可以通过Drozer和weasel(MWR的高级漏洞利用有效负载)来完成,它们可以安装完整的代理,将有限的代理注入到正在运行的进程中,或者将反向shell作为远程访问工具(RAT)连接起来。

在博客文章“WebView addJavascriptInterface远程代码执行”中包含了对攻击的完整描述。