原文链接:http://bobao.360.cn/learning/detail/127.html
在上一期中,我们讨论了攻击及加固Activity组件的方法,今天我们来看看所谓的”Content Provider Leakage”。
什么是Content Provider? 按照Google为Android设计的安全模型,应用的数据属于私有数据,故默认情况下,应用无法访问其他应用的私有数据。但当应用需要与其他应用共享数据时,Content Provider就扮演着应用间数据共享桥梁的角色。Content Providers使用标准的insert(),query(),update(), delete()等方法来操作应用的数据,每个Content Provider都对应一个以”content://”开头的特定URI,任何应用都可以通过这个URI操作Content Provider 应用的数据库。 [/url] 某些时候,应用的Content Provider并不是为了与其他应用共享数据,或者是为了与具有一定权限的应用共享数据,在这种情况下,如果应用对权限控制不当就会造成信息泄露。 Android中内置的SMS短信应用就是一个典型的Content Provider的例子,任何应用都能通过这个URI读取收件箱:content://sms/inbox,但必须在应用的AndroidManifest.xml文件中登记READ_SMS权限。 本文用到的示例应用下载: [url=http://yunpan.cn/cfARX3G3WbFw8]http://yunpan.cn/cfARX3G3WbFw8 提取码:d52d (源码及apk) 前期准备: 安装了Android SDK的电脑 一台未root的Android设备 示例程序功能测试: 下载了测试应用之后,安装在一个未root的android设备中 可通过以下命令安装 | #adb install <name of the apk>.apk
|
该应用具有保存数据的功能,打开运行后的界面如下: [/url] 我们的目标是寻找该应用是否实现了Content Provider,如果有,我们就需要进一步对其进行测试看是否会造成信息泄露。 相关主题: 信息收集 攻击脆弱的Content Provider 应用加固 信息收集: 与其他的渗透测试步骤一样,我们同样从信息收集入手。假设现在我们都拿到了APK文件,使用我们第一期介绍的方法反编译该APK文件,检查在APK的AndroidManifest.xml文件中注册的content provider。并检查所有用到了相关URI的smali文件。 Content provider 通常以如下形式在AndroidManifest.xml中注册 [url=http://p0.qhimg.com/t01e3db78ce59e0e7b6.png] 检查测试应用的AndroidManifest.xml文件: [/url] 我们在AndroidManifest.xml文件中发现其中注册了一个content provider ,并且该content provider 是暴露的(android:exported=”true”),这意味着所有应用都可以访问这个content provider 攻击content provider 这是我们这次试验最有趣的部分了,现在我们尝试通过这个content provider 去查询数据,如果有数据返回,就意味着这个content provider 是可以被攻击的,我们有很多种办法来进行这个查询: 1、 使用adb命令 2、 使用一个恶意应用发起查询 3、 使用Mercury框架(译者注:以改名为drozer) 使用adb 要使用adb来访问content provider,测试应用要先安装在一台供测试的设备上。 首先获得一个adb shell (cmd: # adb shell),并使用下面的命令来读取content provider.比如我现在要去的读取一个在MyProvider.smali中发现的URI: Content –query –uri content://com.isi.contentprovider.MyProvider/udetails 不出意外的话,我们就能看到储存在应用数据库中的内容了,如下图所示: [url=http://p6.qhimg.com/t01f8850f6248eb5945.png] 使用恶意应用 我们甚至能自己写一个简单的恶意应用来读取content provider。以下一段读取收件箱的示例代码: [/url] 使用Mercury框架(drozer) 使用mercury框架,整个攻击过程将更加简单和高效。 加固应用 1、 设置android:exported 属性为false: 在我们这个应用的AndroidManifest.xml文件中,我们应该加上以下属性来对应用进行加固,比如,我们的content provider 的类名是com.isi.contentprovider.MyProvider [url=http://p5.qhimg.com/t014c38c1128ea8a492.png] 如果我再尝试读取一个属性android:exported 为false的content provider就会抛出异常,如图所示: [url=http://p1.qhimg.com/t01d87ffbadd1680e92.png][/url] 注:API level 在17以下的所有应用的android:exported属性默认值都为true. 2、 通过设置自定义权限来限制对content provider的访问 我们可以通过自定义权限来对content provider的访问进行权限控制.这在开发者想对具有特定权限的应用开放访问的情况下很有用。 Content Provider的其他安全问题 sql注入:如果安全控制不当,Content Provider 会造成客户端的SQL注入,与传统的SQL注入攻击方法类似。 目录遍历:如果Content Provider的实现存在问题,可能还会造成目录遍历。这与WEB中的目录遍历类似,允许攻击者遍历并访问本地文件系统。可通过该漏洞读取设备中的敏感文件。
|