前言:

最近入门开始玩android的安全,但是国内研究的真的很少,国外有本牛逼的书《Android Hacker's Handbook》,写的不错,但是看着睡着了好几次。泪奔。前几天测试了下drozer,感觉挺好用,应xsser要求写一篇关于APP中sql注入的文章。由于本人刚入门,描述或者说法难免有错误,还望大牛们跟贴指正。

1. android中的数据存储与查询

1.1 数据存储

众所周知,Android中的数据多是存储在Sqlite数据库中,这个文件一般在手机的系统路径如:/data/data/com.xx.yy/databases/zzz.db。其中com.xx.yy为包名。zzz.db名字随意,为数据库文件。

在安卓应用程序中,有一个非常重要的组件,即“content provider”

当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。

可以看出,该组件的目的就是将自己的数据暴露出去,也就是说程序A提供了一个provider,然后程序B可以通过访问这个provider来获取A暴露的数据。如此一来即达到了数据共享的目的。那么程序B又是如何访问这个provider的呢?

1.2 数据查询

一个程序要访问暴露的provider,首先要知道访问的目标地址,类似http协议,provider也有自己的规范,即类似content://com.aaaa.bbb.class/tablename

其中,com.aaaa.bbb为包名,class为类名,tablename为表名,一般是这样子,具体看自己定义了。

看一个查询例子:

Cursor cursor = contentResolver.query(
	Words_CONTENT_URI, new String[]{"user","pwd"},
	null, null, null);

这是调用contentResolver的query方法进行数据库查询,返回一个cursor对象,即类似DataReader的东西,里面是返回结果。

来看看query的参数

Cursor android.content.ContentResolver.query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

uri即content://com.aaaa.bbb.class/tablename

projection即你要查询的列名

selection和selectionArgs共同控制后面的sql语句中的where内容.

sortOrder即order by xxx的内容。

那么例子中的查询整个构造的语句即:

select user,pwd from tablename;

2.Sql注入问题

综合上面的内容,我们可以看到,query里至少两个参数我们可控,一个是projection,一个是selection,这两个都会影响SQL与的组成,也就为注入提供了可能。

这里以某app为例(虽然感觉漏洞影响有限,但是为了尊重厂商,请允许打码处理),该app对外暴露了一个content provider,uri为:content://com.masaike.mobile.downloads/my_downloads,其中com.masaike.mobile为包名,downloads为库的名字,my_downloads为表名(不一定,可自定义的哦)。

现在语句这么写:

Cursor cursor = contentResolver.query("content://com.masaike.mobile.downloads/my_downloads", new String[]{"_id'","method"},null, null, null);

其中_id和method为两个字段名,我们在_id后面加个单引号,运行下看logcat内容:

我们在_id后面加个单引号,运行下看logcat内容

从上图很容易看出来,SQL语句因为有个单引号,导致出错。所以注入是存在的。

而如果我们修改projection的内容为"* from sqlite_master where type='table';--",这样子即在闭合后面查询的情况下显示出来全部的表名。当然也可以构造其他语句了。

3. 延伸问题

3.1.update

如果有些敏感配置文件存放在库里面,并且存在注入,我们可以通过contentResolver的update方法去修改配置文件,达到间接控制的目的,这个可以用来修改敏感配置、生成短消息钓鱼之类的。

3.2. 跨库

很多情况下,暴露的是一些无关紧要的东西,比如“downloads”这个库,里面仅仅放了一些下载历史。还有些比如message,里面只放了一些通知。这个时候影响很有限,但是同时,在download.db的同目录下还有个account.db,这个里面存放了所有用户名和密码,如果可以跨到这个库,我们会收获更多。而sqlite本身是支持attach来跨库操作的,但是我测试的时候无法在一个完整的sql语句中完成跨库读取,具体问题见:http://zone.wooyun.org/content/15084

3.3. 任意文件读取

数据存储的uri很多时候并不依赖于sqlite库,还有些是本地文件,会根据content/com.xx.yy/filepath 这种uri来读取文件,当这个filepath可控的时候,我们就可以借助这个uri读取任意文件,当然得是应用程序有权限读取的文件。某漏洞

4. 自动化发现漏洞

推荐工具:drozer

使用参考案例:http://www.freebuf.com/tools/26503.html

练手可以看下官方的文档即可。

自动化语句:run scanner.provider.injection 即可自动化发掘已安卓的app中的SQL注入问题。

5. 总结

这个漏洞的影响点我个人认为有两个问题,一是content provider不应该暴露让任意程序都可访问。二是其他程序是否可以update数据库,比如直接修改配置参数之类的。如果仅仅是读取一些不敏感信息,影响有限,但是如果update的话,影响就会变大。如果可以跨库读取内容,那影响就会变得更大。

[原文地址]

各种吐槽:

1#

cnrstar (Be My Personal Best!) | 2014-09-09 18:10

@xsser come on

2#

进击的zjx (信息安全应届小硕找工作中,求领走- -!) | 2014-09-09 18:19

好贴mark @瘦蛟舞

3#

小胖子 (z7y首席代言人) | 2014-09-09 18:35

研究出来了啊?

4#

小乐天 | 2014-09-09 18:51

这也可以?

5#

cnrstar (Be My Personal Best!) | 2014-09-09 19:19

@小乐天 大神莫见笑,话说如何用sqlmap跑嘛?

6#

回复此人感谢

小乐天 | 2014-09-09 19:37

晚上我会写一篇文章出来,不过我觉得咱们可以做个朋友?交流交流,能否加个扣

7#

cnrstar (Be My Personal Best!) | 2014-09-09 19:41

@小乐天 已私信

8#

浮萍 | 2014-09-09 21:54

9#

zj1244 | 2014-09-10 09:47

@小乐天 求大神分享文章,感谢!

10#

瘦蛟舞 | 2014-09-10 10:04

@进击的zjx 会整理相关信息发到drops~

11#

zeracker (多乌云、多机会!) | 2014-09-10 11:05

@瘦蛟舞 内容整理丰富下 能带来更多价值。

12#

xsser (十根阳具有长短!!) | 2014-09-10 11:35

这么好的内容都没人感谢,我觉得社会主义很难实现了

13#

乐乐、 | 2014-09-10 11:41

@xsser 你应该给他转账 ~

14#

cnrstar (Be My Personal Best!) | 2014-09-10 11:41

@xsser 就是,止步在中国特色社会主义了,哈哈

15#

hqdvista (...) | 2014-09-10 11:52

小乐天说的是不是这个:https://labs.mwrinfosecurity.com/tools/webcontentresolver/

16#

Sogili (.) 长短短 (.) | 2014-09-10 12:00

真·不错

17#

cnrstar (Be My Personal Best!) | 2014-09-10 12:28

@hqdvista 恩,其实是drozer可以映射一个web,然后用sqlmap跑,这个思路不错,赞,给忽略了.

18#

clzzy (南无阿弥陀佛) | 2014-09-10 13:20

以前发现并关注过这个问题,有一点:本地数据库至于这么大费周章么?

19#

看风者 | 2014-09-10 13:25

@clzzy 你想象一个场景

你做了个apk,叫美女图片大集合,然后检测某某知名应用可装了

安装了用lz的方法注入,获得隐私信息

偷偷再传出去....

因为美女图片大集合没有申请安全类权限,所以用户是放心的,360等安全卫士也是放心的...

20#

clzzy (南无阿弥陀佛) | 2014-09-10 13:48

@看风者 如此的话,那XML注入也可以引起注意

21#

看风者 | 2014-09-10 13:53

@clzzy

是的,部分shareprefs下的xml权限没有控制好是有机会的

22#

bey0nd | 2014-09-10 13:54

nice

23#

么么哒 | 2014-09-10 13:58

@clzzy 绝大部分是本地的,确实危害不大,希望能有结合网络利用的

24#

z@cx (日复一日,年复一年) | 2014-09-10 15:13

Android Hacker's Handbook 这本书国内 诸葛建伟 大牛正在翻译

25#

_Evil (尘俗当中有太多人 相识过爱不到) | 2014-09-10 21:03

赞一个

26#

gniq | 2014-09-10 22:18

赞一个

27#

he1renyagao ([code]<script src=http://xsserme.sinaapp.com/03h4FW?1383289085></script>[/code]) | 2014-09-11 09:10

赞一个

28#

stomach | 2014-09-11 09:47

赞一个

留言评论(旧系统):

知道91博客 @ 2014-09-12 22:48:53

验证码很有意思,呵呵可以增长知识,但是答案都列出来了,是不是很容易破解啊

本站回复:

很久以前设计的,当时只是预防简单的自动提交机器人,以后有时间了升级下。

ha0r8n @ 2014-10-25 13:33:53

本地库,,哈哈

本站回复:

-_-|||