SQLite 数据库

SQLite是一种基于文件的轻量级数据库。通常使用”.db”,”.sqlite”作为其数据库文件的扩展名。Android为SQLite提供了相当全面的支持。我们的应用创建的数据库只能被该应用访问,其他应用无法访问。

下载上面提供的文件,安装并运行。然后向咱们上一期那样在应用中输入一些数据。

下面的代码片段就是应用操作SQLite数据库的方法。

首先,应用一收到用户输入的用户名和密码,应用就会打开数据库,插入数据然后关闭数据库,如图:

安卓-10-不安全的本地存储-JE2Se ' Blog

下图为插入数据的代码片段,我们扩展了“SQLiteOpenHelper”类。如图,我们将用户输入的数据插入了变量”TABLE_NAME”保存的表名中。

安卓-10-不安全的本地存储-JE2Se ' Blog

现在我们弄清楚了应用如何向数据插入数据,现在我们来看看这些数据在应用中是如何储存的,并想办法把它读取出来。

应用的数据库一般存储在下面的地方:

/data/data/<package name>/databases/<databasename.db>

现在让咱们去上面这个目录下看看应用是否创建了数据库。

跟SharedPreferences一样,我们可以使用adb把文件下载到本地,但这次我们换个姿势。

这次我们使用Eclipse里面的一个叫”DDMS”的功能来从设备中提取数数据,在Eclipse中启用了”DDMS”后,我们就可以干很多有意思的事情。

Ecllispse打开DDMS后如图:

安卓-10-不安全的本地存储-JE2Se ' Blog

使用DDMS,我们只用点点鼠标就能读取出设备中的文件,而不用像使用ADB那样需要敲命令。

在我们的例子中,我们需要进入”/data/data/”下的”com.adnroidpentesting.sqlitestorage”目录。展开目录后就会显示出下面所以的文件,我们感兴趣的SQLite 文件在”databases”目录下,下面的PWNSQLITEDATA.db就是我们需要的文件。我们可以把文件下载到本地电脑上,然后进行如下操作。

1、在电脑上安装SQLite3客户端

2、使用下面的命令连接数据库

Sqlite3 PWNSWLITEDATA.db

3、使用”.tables”命令列出所有的表名。

4、使用”select * from table_name”查询表中所有的数据。

如下图:

安卓-10-不安全的本地存储-JE2Se ' Blog

内部存储

Android应用保存数据的另一种方法就是使用本地存储。打开应用,输入测试用的信用卡号,点击保存。

以下的代码片段显示了应用如何保存数据:

安卓-10-不安全的本地存储-JE2Se ' Blog

应用接收到用户输入后,将其保存到了”secret.txt”文件中。

打开DDMS将对应的secret.txt文件下载到本地。

安卓-10-不安全的本地存储-JE2Se ' Blog

Cat一下:

安卓-10-不安全的本地存储-JE2Se ' Blog

外部存储

SDCARD也是Android中一直重要的存储应用数据的地方,例如whatsapp就将其所有数据存储在SDCARD上。

但开发者需要注意的是,SDCARD上的数据可被任意访问。把SD卡从设备上拆下来,放到其他设备也可以完全读取其中的数据。

测试APP可以在上面的连接中下到,安装后输入一点测试数就。

以下就是应用存取SD卡数据的代码片段。

安卓-10-不安全的本地存储-JE2Se ' Blog

以上代码需要”WRITE_EXTERNAL_STORAGE”权限,需要在AndroidManifest.xml加入权限声明:

安卓-10-不安全的本地存储-JE2Se ' Blog

用户字典

Android还提供了一种叫”用户字典(User Dictionary Cache)”特性。我们可以向用户字典中加入单词,下次用户输入相识的单词时就会给出提示。如果应用允许用户缓存一些敏感信息的话,这些信息就存在一个名为”user_dict.db”的数据库中,任何应用都可以同过用户字典的Content Provider 访问。

另一种办法就是把数据库下载到本地,然后用SQLite 客户端打开,如下图:

安卓-10-不安全的本地存储-JE2Se ' Blog

使用adb下载数据

安卓-10-不安全的本地存储-JE2Se ' Blog

使用SQLite客户端读取数据库中的数据。

总结

本文中,我们介绍了SQLite,本地存储,外部存储等在Android中的实现,我们也演示了通过物理接触能很轻易盗取到这些数据,所以强烈建议开发者们在存储以下敏感信息的时候对数据进行加密