安卓应用漏洞学习case7

安卓应用漏洞学习case7

前期回顾

漏洞免费实战部分-安卓应用层getLastPathSegment函数问题

漏洞实战部分2-安卓应用ZipEntry对象问题实战

漏洞实战部分3-ContentProvider组件的openFile接口问题

漏洞学习之PWN-easyheap分析

漏洞学习之PWN-HITCON_CTF_2016:Secret Holder

漏洞学习之PWN-绿城杯uaf_pwn 分析

漏洞学习之PWN-ASIS_CTF_2016_b00ks

漏洞学习之PWN-lctf2016:pwn200 堆利用

安卓应用漏洞学习-Content Provider组件的自定义权限

漏洞免费实战部分-安卓应用漏洞学习case5

漏洞免费实战部分-安卓应用漏洞学习case6

 

在Android 7.0之后系统禁止在应用外部公开使用file://URI,如果向其他应用传递intent时包含URI为file协议,则应用会报错并抛出FileUriExposedException异常。

解决办法是将file://URI转为content://URI,并授予URI临时访问权限。有个简单的方式是使用FileProvider类实现此功能。

FileProvider是Content Provider的一个特殊子类,它让应用间共享文件变得更加容易,通过创建一个Content URI来代替File URI。一个Content URI可以临时赋予读或写权限。调用时传递参数给Intent.setFlags()来添加权限。

实战学习:

实现个名为case7的简单应用,在case7的私有files目录下创建名为case7.txt 文件并将内容填充为 “learning case7” ,代码如下:

image1

image1

在AndroidManifest文件中增加FileProvider并设置路径,如下:

image2

image2

FileProvider配置解释:

名称

说明

android:name

Android提供的实现类方便快速开发共享文件

android:authorities

FileProvider是Content Provider的实现所有也需要带有标识

android:exported

表示能否被第三方调用,FileProvider默认不能被调用所以要赋值false,不然运行时会报错。

andriod:grantUriPermissions

表示能否赋予临时权限,设为true即为可共享

meta-data标签

xml表数据的标签,这里指配置共享目录的路径映射配置文件

meta-data标签主要看android:resource 变量。这里我设置为 file_provider_paths文件

image3

image3

在res/xml中。

image4

image4

paths标签节点内部主要支持以下几种:

标签

解释

root-path

表示设备的根目录

files-path

表示app私有目录下的files目录

cache-path

表示app私有目录下的cache目录

external-path

表示设备的SD卡的目录

external-files-path

表示外部存储空间App私有目录下的files目录

external-cache-path

表示外部存储空间App私有目录下的cache目录

external-media-path

表示外部存储空间媒体区域的根目录

为方便调用,再创建一个Activity名为sharedfile如下,并且设置为导出可调用:

image5

image5

getIntent()接收外部传入的Intent并获取test和method的变量值,这两个值外部可控。通过method的值判断临时授权是给read或write权限。授权完毕后调用setResult()函数返回Intent给外部调用者,设置返回代码为1 调用finish结束自身退出activity栈顶。

image6

image6

FileProvider.getUriForFile接口在android7以上使用,在低版本使用会报错,故这里判断sdk版本选择性使用将 file 协议的uri转为 content协议的uri。

getUriForFile函数参数说明:

参数1 - 表当前上下文 context

参数2- 表FileProvider的authorities标识

参数3-表File对象

返回值为Uri,在case7应用中具体的值如下:

content://studyFileProvider/internal_files/case7.txt

studyFileProvider 为FileProvider的authorities标识,internal_files 为 file_provider_paths.xml配置文件中表App私有目录下的files目录。这里将原文件路径很好的隐藏了,对比原文件地址:

/data/data/packagename/files/case7.txt

将转化好的uri传给intent 使用setData函数传递,addFlags函数设置intent的权限。

创建poc7应用来调用case7应用实现文件共享。

常规思路是创建Intent设置Component和需要的参数使用startActivityForResult函数调起case7应用中的sharedfile组件获得相应的临时赋权,poc7中重载onActivityResult函数接收case7返回传递的带有临时权限的Intent,拿到带有权限的Intent后去读取文件获取内容。

image7

image7

但是 startActivityForResult 函数在高版本已经废弃不支持使用了。

高版本推荐使用 registerForActivityResult函数,注册ActivityResultCallback回调函数来监听返回值,具体实现如下:

image8

image8

intent启动是利用 ActivityResultLauncher 虚基类中的luncher函数,如下:

image9

image9

poc7应用运行界面如下:

image10

image10

确保所有的地方都没问题后点击按钮即可读取到case7应用共享出来的文件内容。

image11

image11

参考:

安卓存储概念 https://blog.csdn.net/ZNW9876543210/article/details/121476742

 



 

 

关注微信公众号或者可以直接加作者微信:

 

 

 

 

posted @ 2023-02-02 18:43  syscallwww  阅读(82)  评论(0编辑  收藏  举报