app安全测试初级
分析方法:
静态分析
主要是利用apktool、dex2jar、jd-gui、smali2dex等静态分析工具对应用进行反编译,并对反编译后的java文件、xml文件等文件进行静态扫描分析,
通过关键词搜索等静态方式将具有安全隐患的代码进行摘录并存入到检测平台后台,为后续的安全检测报告提供数据依据。
动态分析
动态分析技术是对应用软件安装、运行过程的行为监测和分析。检测的方式包括沙箱模型和虚拟机方式。
(1)沙箱模型方式通过建立安全的沙箱模型,使得移动应用的执行环境是封闭的一个沙箱,不受到沙箱外环境的干扰,结合传统PC机上的沙箱模型原理的分析和研究,得到合适于手机上的沙箱模型。
(2)虚拟机方式通过建立与Android手机终端软件运行环境几乎一样的虚拟执行环境,手机应用软件在其中独立运行,从外界观察应用程序的执行过程和动态,进而记录应用程序可能表现出来的恶意行为。
人工分析
人工分析技术是专业安全人员接收到用户提交的待检测应用后,先对其进行安装、运行和试用,通过在试用过程中,逐步掌握该应用的特点,并通过自己的专业经验,来圈定检测重点。
人工专业检测在涵盖基础检测和深度检测的全部检测项的同时,兼顾侧重点检测,给予应用更全面、更专业、更贴合应用的量身打造的检测服务。
初级测试点:
1. 用户隐私
- 检查是否在本地保存用户密码,无论加密与否
- 检查敏感的隐私信息,如聊天记录、关系链、银行账号等是否进行加密
- 检查是否将系统文件、配置文件明文保存在外部设备上
- 部分需要存储到外部设备的信息,需要每次使用前都判断信息是否被篡改
2. 文件权限
- 检查App所在的目录,其权限必须为不允许其他组成员读写
3 . 网络通讯
- 检查敏感信息在网络传输中是否做了加密处理,重要数据要采用TLS或者SSL
4 . 运行时解释保护
- 对于嵌有解释器的软件,检查是否存在XSS、SQL注入漏洞
- 使用webiew的App,检查是否存在URL欺骗漏洞
5. Android组件权限保护
- 禁止App内部组件被任意第三方程序调用。
- 若需要供外部调用的组件,应检查对调用者是否做了签名限制
6 . 升级
- 检查是否对升级包的完整性、合法性进行了校验,避免升级包被劫持
7. 3rd库
- 如果使用了第三方库,需要跟进第三方库的更新
初级测试方法:
1.接口测试:
测试的是联网的android应用程序,即内部封装了一系列web应用操作接口,实际测试跟常规的web安全测试没有区别。
只不过由于实际的不安全wifi环境,对于移动app调用web接口,涉及到敏感的用户信息,包括用户名,密码,微博的gisd等使用http明文传输,都会造成比较严重的信息泄露。
2.组件测试:
对于android组件测试,就涉及到了apk反汇编的一些知识了,我主要使用的工具有小米人apk改之理以及drozer,通过这两个小工具来反编译apk是很方便滴。我们安全测试的会涉及的组件包括WebView,
和android四大组件Activity、Service、Broadcast Receiver、Content Provider;
测试WebView的方法用的是乌云知识库里面发表的那种方法,反编译apk文件,使用小米人apk改之理或者apktool都可以反编译成smali汇编,然后查找addJavascriptInterface,对导出接口进行测试,一般情况下,
可以直接使用黑盒测试的方法,即让app访问:黑盒测试;关于webview的一个典型的漏洞细节你也可以查看乌云知识库。
测试四大组件就可以使用drozer这款工具,drozer列举的apk的组件都是获取AndroidManifest.xml里面声明的,所以不是很全面,对于程序代码里面动态创建滴,
还是需要反编译查看smali代码,或者还原smali成java代码,当然还原的java代码是也是jd-gui根据生成的smali自动生成的,存在一定的区别。
3.测试Broadcast Receiver:
首先查看一下手机百度使用的Receiver组件,如下:
这里测试的是com.baidu.searchbox.story.DownloadStoryReceiver 这个receiver组件,这里列举的receive主要是因为AndroidManifest.xml存在如下这段代码
<receiver android:name=”.story.DownloadStoryReceiver” android:exported=”true”>
android:exported=”true”表示能接收外部广播因为一看就是下载,然后跟进这个类里面,查看onReceive处理方法,直接查看还原的java代码,有如下片断:
public void onReceive(Context paramContext, Intent paramIntent) { this.b = paramContext; this.d = paramIntent.getStringExtra("download_url"); this.c = paramIntent.getStringExtra("display_url"); if ((TextUtils.isEmpty(this.d)) || (TextUtils.isEmpty(this.c))) if (g) Log.e(h, "Invalid param! download_url or display_url cannot be empty."); while (true) { return; String str1 = paramIntent.getStringExtra("filename"); this.f = ("Content-Disposition","attachment; filename="" + str1 + """); ……………………
所以可以直接发广播测试:
然后就可以看到手机百度会跳转到 http://tea504.sinaapp.com 这个地址,并且后台下载http://tea504.sinaapp.com/xss.js地址的xss.js文件,本地保存为test.xxx
4.测试Content Provider:
这个是负责数据存储,使用的是sqlite数据库,基本上都存在sql注入,一般能够被外界调用都很危险,查看AndroidManifest.xml存在代码:
<provider android:name=”.bookmark.BookmarkProvider” android:writePermission=”com.baidu.permission.write_bookmark” android:exported=”true” android:authorities=”baidusearch_bookmark” />
又是android:exported=”true”,并且只限制了writePemission权限,所以可以恶意app还是可以获取这个读取这个数据库的信息,baidusearch_bookmark记录的是用户浏览历史记录和书签,如下:
这是我手机上的 /data/data/com.baidu.searchbox/databases/SearchBox.db 数据库里面的数据,
然后就可以访问这个uri获取数据测试,如下:
如上 第一次sql语句写错了,提示报错。第二次可以成功查询
当然对于这种组件安全,需要使用恶意app进行攻击。