【安全测试】Android APP安全测试之敏感信息本地存储

大大的世界,小小的人儿;喜欢夜的黑,更爱昼的白。因为热爱安全,所以想起该做些什么了?!公众号主要将不定期分享个人所见所闻所感,包括但不限于:安全测试、漏洞赏析、渗透技巧、企业安全......

1 Android数据存储方式

本文简单介绍Android APP的五种数据存储方式(其中本地存储方式四种、网络存储方式一种,分别为:文件存储数据、SQLite数据库存储数据、使用ContentProvider存储数据、使用SharedPreferences存储数据、网络存储数据)与相关风险点,从安全的角度出发,对本地信息存储进行安全测试以及描述涉及到的检测方法与流程。以下是对5种数据本存储方式的介绍:

1.1 文件存储数据

文件存储方式主要是使用IO流操作读写sdcard上的文件,比如应用程序数据文件夹下的某一文件被其他应用读取、写入等操作,其核心原理为: Context提供了两个方法来打开数据文件里的文件IO流 FileInputStream openFileInput(String name); FileOutputStream(Stringname , int mode),这两个方法第一个参数用于指定文件名,第二个参数指定打开文件的模式。不过权限需要在AndroidManifest.xml文件上进行配置:

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

1.2 SQLite数据库存储数据

SQLite是轻量级嵌入式数据库引擎,支持 SQL 语言,并且只利用很少的内存就有很好的性能,是android等主流移动设备上的复杂数据存储引擎。SQLiteDatabase类为我们提供了很多种方法,支持增删查改等基本的数据库操作。程序运行生成的*.db文件一般位于

/data/data/<package name>/databases/*db

1.3 使用ContentProvider存储数据

ContentProvider主要用于程序之间的数据交换,这些数据包括文件数据、数据库数据和其他类型的数据。一个程序可以通过实现一个Content Provider的抽象接口将数据暴露出去,其他的应用程序可以通过统一的接口保存、读取、修改、添加、删除此Content Provider的各种数据(涉及到一定权限)。Content Provider中使用的查询字符串有别于标准的SQL查询。很多诸如select, add, delete, modify等操作我们都使用一种特殊的URI来进行,这种URI由3个部分组成 “content://”, 代表数据的路径,和一个可选的标识数据的ID。

1.4 使用SharedPreferences存储数据

该存储方式通常用来存储应用的配置信息,保存方式基于XML文件存储的key-value键值对数据,一般作为数据存储的一种补充。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。 SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, intmode)方法来获取实例。存储路径为:/data/data/<package name>/shared_prefs目录下。

1.5 网络存储数据

以上四种存储都是将数据存储在本地设备上,除此之外,Android APP也通过网络来实现数据的存储和获取。一般调用WebService返回的数据或是解析HTTP协议实现网络数据交互,不过前提是需要在配置文件(AndroidManifest.xml)中设置访问网络权限:

<uses-permission android:name="android.permission.INTERNET" />

2 安全测试要点

在本地信息存储方面,一般主要从SQLite数据库文件和SharedPreferances配置文件是否泄漏敏感信息进行安全测试。此外通过反编译APP,分析源代码获取数据存储过程——>存储路径——>敏感数据文件方面进行考量。

3 安全测试工具

在此次的安全测试中,主要使用AndroidSDK(Software Development)中集合的软件开发工具。

3.1 adb

adb(Android Debug Bridge),android sdk中的一个工具,分为客户端(电脑)和服务端(android手机或者模拟器),可以用来直接操作管理android模拟器或者真实的android设备。主要功能有:

* 运行设备的shell(命令行)

* 管理模拟器或设备的端口映射

* 计算机和设备之间上传/下载文件

* 将本地apk软件安装至模拟器或android设备

常用命令:

帮助信息: adb help查看设备: adb devices登录设备: adb shell adb shell <command命令>上传文件: adb push <本地路径> <远程路径>下载文件: adb pull <远程路径> <本地路径>安装软件: adb install [-r强制安装] [-s将apk安装在SD-Card]卸载软件: adb uninstall [-k 保留配置文件和缓存文件] <软件名

3.2 DDMS(File Explorer)

DDMS(Dalvik Debug Monitor Service),android sdk中的一个工具,是 Android 开发环境中的Dalvik虚拟机调试监控服务。提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、接收 SMS、虚拟地理坐标等服务。通存放在sdk/tools/路径下,直接双击ddms.bat运行。

3.3 SQLite Expert

Android sqlite3数据库管理工具,Android SDK的adk/platform-tools目录下提供的一个简单的sqlite数据库管理工具。可以方便的使用其对sqlite数据库进行命令行的操作,也可以安装SQLite Expert进行图形化的操作。

4 安全测试方法

4.1 usb连接手机

使用usb线将测试手机与电脑进行连接,手机上允许USB调试,并使用adb查看手机终端状态,若出现设备说明连接成功。其他方式连接或使用android模拟器,此处不再叙述。

adb devices

4.2 DDMS查看文件

运行ddms.bat打开ddms,可以看到设备连接状态(自动连接)以及logcat实时打印的日志信息

依次点击Device——>File Explorer:

查看手机上存储的文件:

4.3 data目录权限提升

SQLite数据库文件和SharedPreferances配置文件均在data目录下,但是目前是没有权限查看到的,需要使用adb shell命令进行权限的提升与data目录目前的读写设置(手机需要root)

使用adb shell进入操作系统命令行界面,当前无root权限:

首先进行权限提升,其次对data目录设置777权限:

4.4 DDMS获取敏感文件

在获得root权限并对data目录设置777后,使用File Explorer打开/data/data,查看所要测试的包名

选中databases,点击左上角向左的箭头导出到本地:

选中shared_prefs,点击左上角向左的箭头导出到本地:

4.5 检查SQLite数据库是否泄漏敏感信息

使用SQLite Expert打开下载到本地的数据库文件,检查是否存在敏感信息泄露。注意选择文件的类型为any file

4.6 检查SharedPreferences是否泄漏敏感信息

使用十六进制工具,比如UE、Notepad++等打开下载到本地的配置文件,并搜索是否包含敏感信息。

4.7 检查其他本地文件夹及文件是否泄漏敏感信息

除了重点对SQLite数据库文件和SharedPreferences配置文件进行安全检查外,其他的文件夹均可进行敏感文件、关键字的搜索。

5 参考文档

http://www.cnblogs.com/phoenix--/p/4601724.html 安全测试基础

http://www.cnblogs.com/pxsbest/p/5068482.html Android数据存储五种方式总结

原文发布于微信公众号 - 我的安全视界观(CANI_Security)

原文发表时间:2017-11-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏架构师之旅

轻松搭建分布式文件系统

用户在登录之后可以上传文件,也可以看到所有上传的文件(自己或其他用户上传的文件),并可以下载这些文件。

1844
来自专栏Golang语言社区

select多路选择的模拟实现

有时候有这样一种应用场景:需要等待多个事件到达,然后返回尽可能多的事件;如果没有事件到达就阻塞等待。例如服务器等待客户端建立连接,或者等待客户端数据等就有这种应...

3245
来自专栏犀利豆的技术空间

Redis 分布式锁的正确实现方式

之前我们使用的定时任务都是只部署在了单台机器上,为了解决单点的问题,为了保证一个任务,只被一台机器执行,就需要考虑锁的问题,于是就花时间研究了这个问题。到底怎样...

2650
来自专栏容器云生态

根据红帽RHEL7官方文档对centos7进行技术剖析(一)

序言:红帽7教学环境介绍 rht-vmctl命令介绍; $ rht-vmctl start desktop     启动desktop虚拟机 $ rht-vmc...

2786
来自专栏java沉淀

解决MySQL ERROR 1130 : Host 'XXXX' is not allowed to connect to this MySQL server

1584
来自专栏python百例

115-fork子进程解析

当使用fork编写多进程的程序时,应该想清楚父子进程的工作各是什么。比如,让父进程生成子进程,子进程做具体的工作。当子进程执行完毕后,需要exit退出。如果不退...

1243
来自专栏青玉伏案

Swift3.0服务端开发(四) MySQL数据库的连接与操作

本篇博客我们来聊聊MySQL数据库的连接与操作。如果你本地没有MySQL数据库的话,需要你先安装MySQL数据库。在Mac OS中使用brew包管理器进行MyS...

2008
来自专栏美团技术团队

美团点评数据库中间件DBProxy开源

介绍 随着数据量的不断增大,传统的直连数据库对数据进行访问的方式已经无法满足一般公司的需求。通过数据库中间件,可以对数据库进行水平扩展,由原来单台数据库扩展到...

4695
来自专栏云计算教程系列

如何在Ubuntu 14.04上使用Puma和Nginx部署Rails应用程序

当您准备部署Ruby on Rails应用程序时,需要考虑许多有效的设置。本教程将帮助您部署Ruby on Rails应用程序的生产环境,使用PostgreSQ...

1881
来自专栏xingoo, 一个梦想做发明家的程序员

Elasticsearch增删改查 之 —— Delete删除

删除文档也算是常用的操作了...如果把Elasticsearch当做一款普通的数据库,那么删除操作自然就很常用了。如果仅仅是全文检索,可能就不会太常用到删除。...

19210

扫码关注云+社区