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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值