WebView漏洞:
**
WebView 中的 addJavascriptInterface()接口**
JS调用Android的其中一个方式是通过addJavascriptInterface接口进行对象映射:
// 参数1:Android的本地对象
// 参数2:JS的对象
// 通过对象映射将Android中的本地对象和JS中的对象进行关联,从而实现JS调用Android的对象和方法
mWebView.addJavascriptInterface(new MyJSInterface(),"androidJsInterface");
因为WebView通过addJavascriptInterface绑定了一个Java对象,根据Java的反射机制,就可以获得比更多方法,和间接获得更多的实例对象,进行操作:
try {
Runtime runtime = (Runtime) this.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null);
Process process = runtime.exec("date");
InputStream inputStream = process.getInputStream();
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
byte[] b = new byte[1024];
bufferedInputStream.read(b);
String dateString = new String(b,"utf-8");
Toast.makeText(this,dateString,Toast.LENGTH_LONG).show();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
以上是Java的,它通过当前实例获得了Runtime,接着让它执行date命令。在JS中也是同样道理。
解决方案
(1) Android 4.2版本之后
Google 在Android 4.2 版本中规定对被调用的函数以 @JavascriptInterface进行注解从而避免漏洞攻击:
private static class MyJSInterface{
@JavascriptInterface
public void showMessage(String msg){
Log.d("JS Interface Message#",msg);
}
}
(2)对于Android 4.2以前,需要采用拦截prompt()的方式进行漏洞修复,比较麻烦。