安卓应用漏洞学习case7
安卓应用漏洞学习case7
前期回顾
漏洞免费实战部分-安卓应用层getLastPathSegment函数问题
漏洞实战部分3-ContentProvider组件的openFile接口问题
漏洞学习之PWN-HITCON_CTF_2016:Secret Holder
安卓应用漏洞学习-Content Provider组件的自定义权限
在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
在AndroidManifest文件中增加FileProvider并设置路径,如下:
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
在res/xml中。
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
getIntent()接收外部传入的Intent并获取test和method的变量值,这两个值外部可控。通过method的值判断临时授权是给read或write权限。授权完毕后调用setResult()函数返回Intent给外部调用者,设置返回代码为1 调用finish结束自身退出activity栈顶。
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
但是 startActivityForResult 函数在高版本已经废弃不支持使用了。
高版本推荐使用 registerForActivityResult函数,注册ActivityResultCallback回调函数来监听返回值,具体实现如下:
image8
intent启动是利用 ActivityResultLauncher 虚基类中的luncher函数,如下:
image9
poc7应用运行界面如下:
image10
确保所有的地方都没问题后点击按钮即可读取到case7应用共享出来的文件内容。
image11
参考:
安卓存储概念 https://blog.csdn.net/ZNW9876543210/article/details/121476742
关注微信公众号或者可以直接加作者微信: