当前位置:安全客 >> 知识详情

安卓Hacking Part 2: Content Provider攻防(连载)

2014-12-08 12:56:10 阅读:0次 收藏 来源: 360安全播报

在上一期中,我们讨论了攻击及加固Activity组件的方法,今天我们来看看所谓的”Content Provider Leakage”。

什么是Content Provider?

按照Google为Android设计的安全模型,应用的数据属于私有数据,故默认情况下,应用无法访问其他应用的私有数据。但当应用需要与其他应用共享数据时,Content Provider就扮演着应用间数据共享桥梁的角色。Content Providers使用标准的insert(),query(),update(), delete()等方法来操作应用的数据,每个Content Provider都对应一个以”content://”开头的特定URI,任何应用都可以通过这个URI操作Content Provider 应用的数据库。

http://p4.qhimg.com/t01042d9f700cf477e5.png

某些时候,应用的Content Provider并不是为了与其他应用共享数据,或者是为了与具有一定权限的应用共享数据,在这种情况下,如果应用对权限控制不当就会造成信息泄露。

Android中内置的SMS短信应用就是一个典型的Content Provider的例子,任何应用都能通过这个URI读取收件箱:content://sms/inbox,但必须在应用的AndroidManifest.xml文件中登记READ_SMS权限。

本文用到的示例应用下载:

http://yunpan.cn/cfARX3G3WbFw8  提取码:d52d (源码及apk)

前期准备:

       安装了Android SDK的电脑

       一台未root的Android设备

示例程序功能测试:

下载了测试应用之后,安装在一个未root的android设备中

可通过以下命令安装

#adb install <name of the apk>.apk


该应用具有保存数据的功能,打开运行后的界面如下:

http://p4.qhimg.com/t0161dfdab7852eb28b.png

我们的目标是寻找该应用是否实现了Content Provider,如果有,我们就需要进一步对其进行测试看是否会造成信息泄露。

相关主题:

       信息收集

       攻击脆弱的Content Provider

       应用加固

信息收集:

与其他的渗透测试步骤一样,我们同样从信息收集入手。假设现在我们都拿到了APK文件,使用我们第一期介绍的方法反编译该APK文件,检查在APK的AndroidManifest.xml文件中注册的content provider。并检查所有用到了相关URI的smali文件。

Content provider 通常以如下形式在AndroidManifest.xml中注册

t01e3db78ce59e0e7b6.png

检查测试应用的AndroidManifest.xml文件:

http://p5.qhimg.com/t01b5a3abd13af02b88.png

我们在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

不出意外的话,我们就能看到储存在应用数据库中的内容了,如下图所示:

http://p4.qhimg.com/t01f8850f6248eb5945.png

使用恶意应用

       我们甚至能自己写一个简单的恶意应用来读取content provider。以下一段读取收件箱的示例代码:

http://p6.qhimg.com/t0137f9e510ff6b32d5.png

使用Mercury框架(drozer)

       使用mercury框架,整个攻击过程将更加简单和高效。

加固应用

1、  设置android:exported 属性为false:

在我们这个应用的AndroidManifest.xml文件中,我们应该加上以下属性来对应用进行加固,比如,我们的content provider 的类名是com.isi.contentprovider.MyProvider

http://p1.qhimg.com/t014c38c1128ea8a492.png

如果我再尝试读取一个属性android:exported 为false的content provider就会抛出异常,如图所示:

http://p2.qhimg.com/t01d87ffbadd1680e92.png

注:API level 在17以下的所有应用的android:exported属性默认值都为true.

2、  通过设置自定义权限来限制对content provider的访问

我们可以通过自定义权限来对content provider的访问进行权限控制.这在开发者想对具有特定权限的应用开放访问的情况下很有用。

Content Provider的其他安全问题

SQL注入:如果安全控制不当,Content Provider 会造成客户端的SQL注入,与传统的SQL注入攻击方法类似。

目录遍历:如果Content Provider的实现存在问题,可能还会造成目录遍历。这与WEB中的目录遍历类似,允许攻击者遍历并访问本地文件系统。可通过该漏洞读取设备中的敏感文件。

目录

安卓Hacking Part 1: 应用组件攻防(连载) 

安卓Hacking Part 2: Content Provider攻防(连载)

安卓Hacking Part 3:Broadcast Receivers攻防(连载) 

安卓Hacking Part 4:非预期的信息泄露(边信道信息泄露)

安卓Hacking:Part 5:使用JDB调试Java应用 

安卓Hacking Part 6:调试Android应用 

安卓 Hacking Part7:攻击WebView

安卓Hacking Part 8:Root的检测和绕过

安卓hacking Part9: 不安全的本地存储:Shared Preferences 

安卓Hacking Part 10:不安全的本地存储

安卓Hacking Part 11:使用Introspy进行黑盒测试 

安卓Hacking Part 12: 使用第三方库加固Shared Preferences 

安卓Hacking Part 13:使用Drozer进行安全测试  

安卓Hacking Part 14:在没有root的设备上检测并导出app特定的数据




本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:http://resources.infosecinstitute.com/android-hacking-security-part-2-content-provider-leakage/

参与讨论,请先 | 注册 | 匿名评论
发布
用户评论
z0sa 2017-07-12 23:32:57
回复 |  点赞

去英文原文链接上面找啊

360U2552393810 2017-04-10 16:14:14
回复 |  点赞

文章里面apk demo的共享链接都失效了,可否再分享一下呢,谢谢!

360U2552393810 2017-04-10 16:14:14
回复 |  点赞

文章里面apk demo的共享链接都失效了,可否再分享一下呢,谢谢!

nickname_136 2015-11-19 10:35:14
回复 |  点赞

不是每个角落

alex 2015-09-29 18:36:41
回复 |  点赞

使用adb检测那段命令错了,应该是: content query --uri content://com.isi.contentprovider.MyProvider/udetails

f_alcon 2015-01-31 11:28:34
回复 |  点赞

文中的 &#34;注:API level 在17以下的所有应用的android:exported属性默认值都为true.&#34; 这句话不准确, 用API level 16测试发现, ContentProvider的android:exported属性默认值为true, 但Activity的默认值为false

hi 2014-12-20 16:28:33
回复 |  点赞

我修改了android:exported 为false,结果还是能读。

adrain09 2014-12-09 17:25:03
回复 |  点赞

手机没有content命令咋办?

alert(&#34;1&#34;) 2014-12-09 15:08:59
回复 |  点赞

alert(&#34;1&#34;)

我的测试名字 2014-12-09 10:52:36
回复 |  点赞

哈哈哈 哈哈哈

anykno 2014-12-08 21:18:15
回复 |  点赞

亲,没有意外啊,数据内容就是“Xxvv”,只是与文章内容不同而已。

Rlverhac 2014-12-08 19:49:20
回复 |  点赞

&#34;不出意外的话,我们就能看到储存在应用数据库中的内容了,如下图所示:&#34; 额,我出意外了, 结果:“row=0,id=0,name=Xxvv” 我的是华为3x,是手机的问题吗

查看更多