Android App数据安全测试

简介

Android App本地数据存储是使用SQLite数据库,SQLite 是遵守ACID的关系数据库管理系统,它包含在一个相对小的C程序库中。与许多其它数据库管理系统不同,SQLite不是一个客户端/服务器结构的数据库引擎,而是被集成在用户程序中。

如果你是应用程序开发人员,你可能还会注意到 SQLite 查询看起来或多或少像 SQL 一样。 在 Android 中选择 SQLite 的原因是其内存占用较低,也不需要设置或配置数据库,并且可以在应用程序中直接调用。

获取SQLite文件

Android

SQLite 数据库默认在 Android 中存储在/data/data/[package name]/databases/位置,扩展名为.db文件,注意Android 设备需要root

  1. 进入设备的/data/data目录,查找对应的测试包。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    C:\Users\Shuqing
    λ adb shell
    HWVOG:/ # cd /data/data
    HWVOG:/data/data # ls
    android com.android.egg com.android.providers.telephony
    android.ext.services com.android.externalstorage com.android.providers.userdictionary
    android.ext.shared com.android.gallery3d com.android.provision
    cn.goapk.market com.android.htmlviewer com.android.proxyhandler
    com.amaze.filemanager com.android.inputdevices com.android.server.telecom
    com.android.backupconfirm com.android.inputservice com.android.settings
    com.android.bluetooth com.android.keychain com.android.sharedstoragebackup
    com.android.bluetoothmidiservice com.android.location.fused com.android.shell
    com.android.bookmarkprovider com.android.managedprovisioning com.android.statementservice
    com.android.browser com.android.mms.service com.android.storagemanager
    com.android.calllogbackup com.android.mtp com.android.systemui
    com.android.camera2 com.android.onetimeinitializer com.android.vpndialogs
    com.android.captiveportallogin com.android.packageinstaller com.android.wallpaperbackup
    com.android.carrierconfig com.android.phone com.android.wallpapercropper
    com.android.certinstaller com.android.printservice.recommendation com.bignox.app.store.hd
    com.android.contacts com.android.providers.blockednumber com.bignox.google.installer
    com.android.cts.ctsshim com.android.providers.calendar com.example.android.softkeyboard
    com.android.cts.priv.ctsshim com.android.providers.contacts com.google.android.webview
    com.android.defcontainer com.android.providers.downloads com.tal.kaoyan
    com.android.documentsui com.android.providers.media com.vphone.helper
    com.android.dreams.basic com.android.providers.settings com.vphone.launcher
    HWVOG:/data/data #
  2. 这里我们获取包 com.tal.kaoyandb文件。进入包文件databases目录内部可以看到如下db文件。

1
2
3
4
5
6
7
8
9
10
11
HWVOG:/data/data # cd com.tal.kaoyan
HWVOG:/data/data/com.tal.kaoyan # ls
app_english_word app_textures app_webview cache code_cache databases files lib shared_prefs
HWVOG:/data/data/com.tal.kaoyan # cd databases/
HWVOG:/data/data/com.tal.kaoyan/databases # ls
cc.db future_db.db-journal httpcache.db pushg.db-journal userdb0
cc.db-journal gkt httpcache.db-journal pushsdk.db userdb0-journal
ext_download.db gkt-journal pushext.db pushsdk.db-journal zjbnews.db
ext_download.db-journal google_analytics_v2.db pushext.db-journal ua.db zjbnews.db-journal
future_db.db google_analytics_v2.db-journal pushg.db ua.db-journal
HWVOG:/data/data/com.tal.kaoyan/databases #
  1. 退出adb shell 我们将future_db.db拷贝出来放到本地电脑。
1
2
3
C:\Users\Shuqing
λ adb pull /data/data/com.tal.kaoyan/databases/future_db.db C:\Users\Shuqing\Desktop
/data/data/com.tal.kaoyan/databases/future_db.db: 1 file pulled, 0 skipped. 8.8 MB/s (167936 bytes in 0.018s)

查看SQLite文件

导出db文件后我们可以使用 DB Browser for SQLite
来查看数据内容。

下载地址:https://sqlitebrowser.org/dl/ 根据自己的系统版本来选择安装即可。

  1. 启动应用,然后依次点击菜单:文件->打开数据库选择我们导出的future_db.db即可查看数据库表结构和内容。

SQLite

  1. 点击浏览数据菜单可以查看表具体数据内容。

SQLite_data

  1. 点击执行SQL菜单可以输入SQL命令来进行数据的增删改查。

SQLite_sql

SQLite数据安全

SQL注入

如果通过应用获取用户输入的数据并将其插入 SQLite 数据库,那么就有可能发生 SQL注入攻击的安全问题。

SQL注入,就是通过把SQL命令插入到 表单提交或输入域名的查询字符串,最终达到欺骗服务器执行恶意的SQL命令

比如有一个表单,用户可以输入 name

1
2
3
<?php 
$name = $_GET['name'];
$dbh->query("SELECT * FROM users WHERE name='{$name}'");

那么当用户输入的namePython'; DELETE FROM user; 时会变成什么?

1
SELECT * FROM users WHERE name='Python'; DELETE FROM user;'';

这条语句运行一下,会发现什么? 我们的 user 表被清空。

预防SQL注入

防止SQL 注入,我们需要注意以下几个要点:

  1. 永远不要信任用户的输入。
  2. 对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双引号 进行转换等。
  3. 永远不要使用动态拼装 SQL ,可以使用SQL 预处理语句。
  4. 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
  5. 不要把机密信息直接存放,加密或者 hash 掉密码和敏感的信息。
  6. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。

参考资料