热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

对Webview跨源攻击的理解

首先是addJavaScriptInterface漏洞:有时候访问手机百度贴吧网页版本,网页上会有个按钮提示用手机应用打开。这种交互通常都是使用JS来实现,而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命名为aa.html,放到sdcard上,输入file:///sdcard/aa.html,就会触发应用程序的showToast()方法。

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







hellowrold
!



 

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)这个页面,它会给你提示是否有漏洞。

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


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

 

除了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

 


推荐阅读
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文详细介绍了 Charles 工具的下载、安装、配置及使用方法,特别针对 HTTP 和 HTTPS 协议的数据抓取进行了说明。 ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
  • 自动验证时页面显示问题的解决方法
    在使用自动验证功能时,页面未能正确显示错误信息。通过使用 `dump($info->getError())` 可以帮助诊断和解决问题。 ... [详细]
  • 自定义滚动条美化页面内容
    当页面内容超出显示范围时,为了提升用户体验和页面美观,通常会添加滚动条。如果默认的浏览器滚动条无法满足设计需求,我们可以自定义一个符合要求的滚动条。本文将详细介绍自定义滚动条的实现过程。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • Spark中使用map或flatMap将DataSet[A]转换为DataSet[B]时Schema变为Binary的问题及解决方案
    本文探讨了在使用Spark的map或flatMap算子将一个数据集转换为另一个数据集时,遇到的Schema变为Binary的问题,并提供了详细的解决方案。 ... [详细]
  • 解决Parallels Desktop错误15265的方法
    本文详细介绍了在使用Parallels Desktop时遇到错误15265的多种解决方案,包括检查网络连接、关闭代理服务器和修改主机文件等步骤。 ... [详细]
  • 解决 Windows Server 2016 网络连接问题
    本文详细介绍了如何解决 Windows Server 2016 在使用无线网络 (WLAN) 和有线网络 (以太网) 时遇到的连接问题。包括添加必要的功能和安装正确的驱动程序。 ... [详细]
  • 本文介绍了 AngularJS 中的 $compile 服务及其用法,通过示例代码展示了如何使用 $compile 动态编译和链接 HTML 元素。 ... [详细]
author-avatar
素材火
优质网页素材http://www.sucaihuo.com/
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有