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远程代码执行”中包含了对攻击的完整描述。