注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

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

2015-07-26 14:32:07|  分类: Android开发与逆 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在上一期中,我们讨论了攻击及加固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)

前期准备:

       安装了Android SDK的电脑

       一台未root的Android设备

示例程序功能测试:

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

可通过以下命令安装

1
#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中的目录遍历类似,允许攻击者遍历并访问本地文件系统。可通过该漏洞读取设备中的敏感文件。

  评论这张
 
阅读(72)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017