漏洞实战部分3-ContentProvider组件的openFile接口问题
2022-12-25 14:7:52 Author: 安全狗的自我修养(查看原文) 阅读量:13 收藏

前期回顾

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

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

安卓应用漏洞学习case3

本课程学习ContentProvider组件的openFile接口。ContentProvider组件主要作用实现各个应用程序之间的数据共享。可以把它理解为应用对外开放的接口,只要符合Uri格式请求,就可以访问。

openFile定义如下:

public ParcelFileDescriptor openFile (Uri uri,                 String mode,                 CancellationSignal signal)

此方法返回一个 ParcelFileDescriptor,该描述符直接返回 给调用者。这样,大数据(如图像和文档)就可以 返回而不复制内容。

调用方法:

content://authorities + "path"

authorities 是共享应用的标识,是让外部应用通过这个标识找到共享应用接口。path是需要读取文件的路径,但一般都会被被限制,但如果校验不严格,极易造成路径穿越达到任意文件写和任意文件读的效果。

authorities标识符号,在共享应用的manifest.xml中Provide 组件上找到。

实战案例:

为了学习这个openFile接口,我编写了一个case3应用。功能很简单,应用启动时在/data/data/pagename/files 目录下创建tmp、hack两个目录,在tmp、hack两个目录下分别创建了flag.txt文件,tmp目录下的flag.txt文件内容是 “hello tmp”,hack目录下的flag.txt文件内容为“hello hack”。

在opneFile函数处,已经将路径写死为 tmp目录,uri传递的文件名只能是tmp目录下的文件,但是并没有考虑 ../的情况,所以存在路径穿越的问题,控制路径穿越到hack目录下读取flag.txt内容。

provider对外导出的authorities为 com.study.case3:

编写poc 应用调用这个共享接口,读取hack目录下的flag.txt内容。

打开Android Studio 选择 Start a new Android Studio project项

选择Empty Activity

填写项目名和报名,其他不用管,直接Finish

完成后会进入到MainActivity类中,在onCreate函数中实现代码:

代码分两步,当填写了uri则使用填写的uri,如果没有那么就使用写好的uri,这个提前写好的uri只能访问tmp目录下的flag.txt文件内容。它的uri格式为:

String uri = "content://com.study.case3/flag.txt";  //这是读取tmp目录下的flag.txt文件

前分析可知,利用../路径穿越到hack目录下读取flag.txt内容,它的uri格式为:

// 利用../路径穿越到hack目录下,读取flag.txt文件String uri = "content://com.study.case3/../hack/flag.txt"

这个接口也支持向文件中写入内容。路径uri都和读一样,只需要使用FileOutputStream对象去进行写就可以将内容写入,但是这个接口只能追加写入内容,不能覆盖内容,而且也不能创建文件,实现一个写入poc最终如下所示

它的执行效果如下:

如果感兴趣可以了解下漏洞视频教程目录如下:

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

其它学习教程。


文章来源: http://mp.weixin.qq.com/s?__biz=MzkwOTE5MDY5NA==&mid=2247487145&idx=1&sn=1a61c775d71f75dbd704a4f905e4aeeb&chksm=c13f3de0f648b4f63cc2fa2d76f67706fa4e73c5c1c198007759e609cc97a06d36deb430b5aa#rd
如有侵权请联系:admin#unsafe.sh