type
status
date
slug
summary
tags
category
icon
password
一、漏洞APP分析1. AndroidManifest.xml2. Vulnerable 3. FlagReceiver 4.FileProvider 5. file_paths.xml二、攻击APP构造1. 攻击方案三、总结四、参考
一、漏洞APP分析
1. AndroidManifest.xml
AndroidManifest.xml
声明了四个组件,两个Activitycom.bytectf.babydroid.MainActivity
com.bytectf.babydroid.Vulnerable
一个Receivercom.bytectf.babydroid.FlagReceiver
还有一个provider
androidx.core.content.FileProvider
其中MainActivity
导出,Vulnerable
可以通过action
com.bytectf.TEST
触发 2. Vulnerable
Vulnerable
Activity
通过getParcelableExtra
获取intent
并且进行跳转3. FlagReceiver
4.FileProvider
android:name | Android 提供的 FileProvider 的实现类 |
android:exported | 建议指定为 false ,表示该 FileProvider 只能本应用使用,不是 public 的 |
android:authorities | 相当于一个用于认证的暗号,在分享文件生成 Uri 时,会通过它的值生成对应的 Uri,该值是一个域名,一般格式为 packagename.fileprovider |
android:grantUriPermissions | 值为 true ,表示允许赋予临时权限,即设置为共享 |
meta-data | 指定配置共享目录的配置文件 |
Intent 可以提供对内容提供程序的间接访问。即使应用没有访问权限,您也可通过以下方式允许用户访问提供程序中的数据:从拥有权限的应用中返回结果 Intent,或者激活拥有权限的应用并允许用户使用该应用。即使没有适当的访问权限,您也可通过以下方式访问内容提供程序中的数据:将 Intent 发送至拥有权限的应用,然后接收包含URI权限
的结果Intent
。这些是特定内容 URI 的权限,将持续至接收该权限的 Activity 结束。拥有永久权限的应用会在结果 Intent 中设置标记,从而授予临时权限:
- 读取权限:
FLAG_GRANT_READ_URI_PERMISSION
- 写入权限:
FLAG_GRANT_WRITE_URI_PERMISSION
注意:如果内容 URI 中包含提供程序的授权,这些标记不提供对提供程序的常规读取或写入访问权限。访问权限仅适用于 URI 本身。提供程序通过使用<provider>
元素的android:grantUriPermission
属性和<provider>
元素的<grant-uri-permission>
子元素,在其清单文件中定义内容 URI 的 URI 权限
5. file_paths.xml
子节点 | 含义 |
root-path | 代表设备的根目录 / |
files-path | 代表 APP 内部存储空间私有目录 下的 files/ 目录,等同于 Context.getFilesDir() 所获取的目录路径 |
cache-path | 代表 内部存储的 cache 目录 ,与 Context.getCacheDir() 获取的路径对应 |
external-path | 代表 外部存储 (sdcard) 的根目录 ,与 Environment.getExternalStorageDirectory() 获取的路径对应。 |
external-files-path | 代表 外部存储空间 APP 私有目录 下的 files/ 目录,与 Context.getExternalFilesDir(null) 获取的路径对应 |
external-cache-path | 外部存储空间 APP 私有目录 下的 cache/ 目录,等同于 Context.getExternalCacheDir() |
external-media-path | 代表 app 外部存储媒体区域的根目录 ,与Context.getExternalMediaDirs() 获取的路径对应
|
二、攻击APP构造
1. 攻击方案
由于Provider中设置了android:grantUriPermissions="true"
那么就可以通过被攻击APP授予攻击者暂时的权限来读取文件,而file_paths.xml中又指明共享根目录,则可以读取被攻击APP的私密文件flag
我们构造的Uri:content://androidx.core.content.FileProvider/root/data/data/com.bytectf.babydroid/files/flag
实际就对应了file:///data/data/com.bytectf.babydroid/files/flag
因为file provider必须设置为非导出,也就意味着外部无法访问。当需要进行文件共享的时候,需要在Intent中加入下面这些中Grant相关的flags
,在这里使用前两个就可以
- FLAG_GRANT_READ_URI_PERMISSION:允许接收者读取 URI 的内容,即读取 URI 的数据,并在权限授予期间保持该权限。
- FLAG_GRANT_WRITE_URI_PERMISSION:允许接收者写入 URI 的内容,即修改 URI 的数据,并在权限授予期间保持该权限。
- FLAG_GRANT_PERSISTABLE_URI_PERMISSION:与
FLAG_GRANT_READ_URI_PERMISSION
或FLAG_GRANT_WRITE_URI_PERMISSION
一起使用,表示允许接收者在授予许可后持久保存该权限。这意味着即使应用程序被关闭,权限也会保持有效,并且对 URI 的访问仍然是允许的。
- FLAG_GRANT_PREFIX_URI_PERMISSION:允许接收者读取或写入指定 URI 的所有后代 URI,而不必单独为每个 URI 授予权限。
MainActivity源码
HttpGetAsyncTask 源码
Android11 攻击效果
三、总结
四、参考
- 作者:LLeaves
- 链接:https://lleavesg.top//article/ByteCTF-2021-BabyDroid
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章