前期回顾
漏洞免费实战部分-安卓应用层getLastPathSegment函数问题
安卓应用漏洞学习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最终如下所示
它的执行效果如下:
如果感兴趣可以了解下漏洞视频教程目录如下:
关注微信公众号或者可以直接加作者微信:
其它学习教程。
原文始发于微信公众号(安全狗的自我修养):漏洞实战部分3-ContentProvider组件的openFile接口问题