Android Webiew的addJavascriptInterface带来的漏洞

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()的方式进行漏洞修复,比较麻烦

上一篇:java JVM-自定加密和解密类加载器


下一篇:java反射初探