关于APP渗透测试的实践与思考

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据传输服务 DTS,数据同步 1个月
简介: 云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 一、前言移动互联网应用程序(Mobile APP,以下简称“APP”或“移动APP”)安全早已成为信息安全领域中广受关注的热点话题。

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


一、前言

移动互联网应用程序(Mobile APP,以下简称“APP”或“移动APP”)安全早已成为信息安全领域中广受关注的热点话题。作为安全检测人员,在日常测试工作中经常涉及移动APP的安全检测,在此结合相关移动APP检测标准和工作经验,从渗透测试角度,对移动APP的检测进行概要性总结说明。

二、目标分析

移动APP的安全问题与传统桌面软件有所不同。虽然现代移动操作系统(如Android和iOS)已比较注重安全防护,但如果APP开发人员在开发移动应用程序时不全面仔细地考虑安全性,APP仍可能会存在可被利用的安全漏洞,从而面临安全威胁。移动APP渗透测试目的就是充分分析和挖掘移动APP和相关系统存在的安全问题,进而帮助其进行修复,提升安全性,保护用户信息。

从业务上来看,在移动APP架构中,面临安全威胁的目标 / 路径主要有三个,它们分别是:移动APP、数据传输和服务端。

1

三、面临的威胁

1. 客户端

客户端(移动APP)主要面临的威胁包括反编译、调试、篡改/重打包、输入记录、组件安全、注入和Hook、本地敏感数据泄露等。

(1) 反编译

对一个软件进行分析可以分为静态分析和动态分析两大部分。反编译是静态分析的一种基础手段。高级编程语言源代码经过编译变成可执行文件,反编译就是其逆过程。通过反编译和逆向,可以在没有软件源码的情况下了解其内部实现细节,进行漏洞挖掘和算法分析等。移动APP测试,常见的测试对象是Android APP和iOS APP,由于应用结构、构建工具链等差异,Android APP和iOS APP的逆向分析、反编译技术方法均不尽相同。常见的反编译工具有IDA Pro及相关Decompiler插件、Radare2 、Ghidra、JD-GUI、Smali/Baksmali、dex2jar、Hopper等等。

(2) 调试

调试是软硬件开发人员用于排查软件错误的一种手段,也是安全检测人员进行动态分析的一种基本方式。从调试对象来看,调试可分为硬件调试和软件调试。对于移动APP,安全检测工程师一般只需进行软件调试。软件调试又可分为源码级调试和非源码级调试。在获取不到源码的情况下,一般只能先做非源码级调试。通过调试,安全检测工程师可以动态地分析APP内部原理和行为。移动APP检测中,常见的APP调试工具有IDA Pro、GDB、LLDB、ADB、JDB和Cycript等。

(3) 篡改/重打包

Android和iOS应用在正式发布前需进行数字签名,在安装时系统会对APP签名进行检查,检查通过才能成功安装运行。这可在一定程度上保护APP不被篡改。但由于签名验签机制很多技术都是公开的,被研究的比较透彻,再加上不同平台的签名机制对APP限制程度各不相同,对安全性要求比较高的APP如果只依靠系统层面的签名保护进行防篡改/重打包还远远不够。渗透测试过程中,有时我们为了更好的分析APP,也需要对APP进行修改重打包,然后利用相应平台的工具进行重新签名,最后安装运行。相应的工具有:apktool、apksigner 、signapk、jarsigner和codesign等。

(4) 输入记录

当APP在不安全的环境中运行时,存在用户输入被记录风险。一般可能通过软硬件键盘输入设备事件或屏幕截取等方式来进行记录。根据对APP不同的安全要求,渗透测试中宜需关注这些风险。

(5) 组件安全

Android组件包括Activity、Broadcast Receiver、Service和Content Provider。若权限配置不当而导致组件暴露,APP就存在可能被其他应用攻击或劫持风险,进而导致认证被绕过、敏感数据被窃取等。测试过程中,一般可通过对APP进行反编译,查看AndroidManifest文件或直接扫描查找暴露的组件,分析反编译的相关组件代码,查看是否有安全漏洞并进行验证。

(6) 注入和Hook

注入和Hook都可对目标APP运行时行为进行修改。虽然我们常常将它们放在一起说,但其实它们的实现原理并不相同。注入是指将一段代码或一个完整的可执行模块加载到目标程序中,而Hook是指通过劫持程序执行流程来改变程序运行行为。不同平台的APP运行框架和机制不同,这也导致它们的注入和Hook方式不同,但都会通过系统或框架提供的相关机制和接口进行操作。测试人员可根据需求寻找Hook点,编写注入或Hook模块。常用的相关工具有libinject、Xposed、Cydia、fishhook和Frida等。

(7) 本地敏感数据泄露

APP的本地存储数据或运行日志有可能会泄露敏感或非敏感数据。一般测试人员通过泄露的数据,可以去进一步深入理解APP内部原理。测试人员可查看APP本地数据存储(特别是会关注APP是否在公共区域存储了数据)和APP运行日志内容,结合业务场景综合分析是否存在本地敏感数据泄露风险。常用工具adb、RE、SQLite和ifile等。

2. 数据传输

APP与服务端进行的网络数据传输过程中主要面临的威胁包括数据窃听、数据篡改和数据重放等。

(1) 数据窃听

若APP和服务端通信过程中未对传输的数据进行机密性保护,数据就有可能会被窃听。例如,很多APP和服务端之间在不安全的传输通道中直接使用的HTTP协议进行通信,若用户名、口令以及其他重要数据未进行加密,这些数据在网络传输中的各个节点就可能会被窃听而泄露。测试人员应根据APP业务场景确认APP的敏感数据**、数据传输通道和协议,分析是否存在敏感数据泄露风险。对安全性要求比较高的APP,例如金融类APP,还要分析其加密方式(如果有)是否安全有效。常用工具有Wireshark、Burpsuite、Fiddler和Charles等。

(2) 数据篡改

若APP和服务端通信过程中未对传输的数据进行完整性保护,数据就有可能会被篡改,使APP更易被结合其他安全漏洞发起攻击。不同的业务场景下,数据篡改带来的风险高低也不同。测试人员可尝试对截取到的数据进行篡改后发送,观察和分析APP或服务端是否可识别出数据被篡改并作出合理反应。对安全性要求比较高的APP,比如金融类APP,还要分析其防篡改方式(如果有)是否安全有效。常用工具有Wireshark、Burpsuite、Fiddler和Charles等。

(3) 数据重放

重放攻击是指将之前窃听到的数据原封不动地重新发送给接收方。这种攻击通常用于身份认证、交易等过程。例如,对HTTP协议,测试人员可重复发送截取到的请求报文,并观察和分析服务端的反应。常用工具有Wireshark、Burpsuite、Fiddler和Charles等。

3. 服务端

服务端主要面临的威胁包括不安全的中间件、认证与会话管理、访问控制、注入、应用层拒绝服务、密码算法和密钥管理等。

(1) 不安全的中间件

服务器为提供完整的服务所使用的各个中间件,由于未及时更新或未启用安全的配置可能引发安全漏洞,导致服务器存在遭受攻击的风险,如IIS文件名解析漏洞、Weblogic反序列化漏洞、SMB远程命令执行漏洞等,攻击者可通过这些漏洞获取服务器敏感信息、执行恶意命令,甚至获取服务器管理员权限。

(2) 认证与会话管理

服务器提供的身份认证和会话管理机制存在安全漏洞,如系统关键组件或应用使用弱口令,对于高安全级别的系统未采用双因子认证方式,无防止认证口令或验证码暴力破解攻击的机制,未对SessionID的生成、过期和销毁进行安全配置等,攻击者可利用这些漏洞在非授权的情况下登录系统并执行恶意操作。

(3) 访问控制

开发者未对用户登录系统后的操作进行进一步的访问权限控制,服务端对从客户端收到的对数据进行增、删、改、查询等操作的请求未进行鉴权处理,导致攻击者可执行超出自身账户权限的操作。

(4) 注入

应用运行时可能需要调用一些向前端写入内容、查询数据或执行系统命令的函数,如果用户能控制这些函数的输入,而开发者未对输入的内容进行严格的过滤,攻击者可以在前端提交恶意构造的输入,进行XSS注入、SQL注入、命令注入等攻击,从而导致服务器重要数据泄露或执行恶意命令。

(5) 应用层拒绝服务

服务器未对应用的最大连接数或发起请求的IP和频率进行限制,攻击者通过并发大量的请求或构造畸形的数据包,如CC攻击、Slowloris攻击,造成系统资源耗尽,导致服务器拒绝服务。

(6) 密码算法和密钥管理

应用使用已被证明为不安全的密码算法对重要数据的传输和存储进行加解密,如使用MD5算法对用户口令进行存储,使用DES算法对数据进行加密传输,可能导致攻击者获取密文后短时间内恢复出明文信息;应用使用不安全的方式进行密钥管理,如将系统使用的密钥明文编码在应用代码中或在服务器配置文件中明文存储,将导致攻击者轻易获取数据加解密密钥,进而得到加密数据的明文信息。

四、APP渗透测试流程

渗透测试的最终目的是帮助目标APP或系统发现并修复安全漏洞,提升APP或系统安全性。一个优秀的渗透测试工程师或团队首先要有良好的职业道德,同时也应注意保护自己,其次要有专业的技术知识、规范的测试流程和活跃的思维。下面,我们先介绍一般的APP渗透流程,然后探讨下结合APP,对服务端开展渗透测试的一些思路。

1. 准备阶段

定义安全测试的范围,包括确认适用的安全控制点、受测方的测试目标和敏感数据。同时在开展渗透测试前,应拿到被测单位的书面盖章渗透测试授权。

2. 信息收集

收集包括APP的环境、业务用例和架构等信息。其中:

  • 环境信息如APP的业务功能、行业分类、开发或运营组织的基本信息和工作流程等;
  • 架构信息包括APP本身(如何访问数据和资源、是否检测自身运行在root或模拟环境中等)、APP适用的操作系统及版本、与服务端的通信协议(是否使用安全传输协议、是否有其他安全防护措施等)和远程服务(APP使用哪些远程服务、这些远程服务被攻击是否会影响APP)等。

这些信息大致分为开发或运营组织的信息和APP相关技术信息两大类,一般前者可由商务人员负责去收集,后者可由技术人员收集。

3. 应用描绘

根据前2个阶段收集的资料(亦可通过自动扫描、手动分析APP来进行相应补充),测试人员已较为全面的了解受测APP的环境、业务用例和架构等信息,并基本确定了受测APP的渗透测试入口点、收集存储的数据和可能潜在的安全漏洞,即可根据这些漏洞风险等级高低,对其进行排序,以便测试人员确定渗透测试的攻击路径,并制定相应的测试用例。

4. 漏洞利用和测试工具开发

在此阶段,测试人员将尝试利用前一阶段发现的漏洞,对应用程序进行渗透,以验证发现的漏洞是否真实、有效,同时在漏洞验证过程中可能涉及测试工具、脚本的开发;该阶段在APP渗透测试的整个过程中是非常必要和关键的一环。

5. 提交报告

此阶段,测试人员将已经验证后的漏洞形成报告,提交客户。报告内容至少应包括详细的漏洞名称、类型、漏洞风险分析、漏洞利用过程和结果、渗透测试过程中非授权访问的数据等。

注:不同类型安全检测除流程上会有差异外,报告内容、形式也会有差别,应根据具体情况具体分析。

五、结合APP渗透服务端

这一章节我们主要列举通过APP以渗透相关服务端的一些思路。在此,假设测试人员仅被授权对APP和相关服务端进行渗透。通常包含5个较为重要的环节,分别是:信息收集、网站/服务端渗透、APP功能分析、第三方SDK分析、账号安全和业务安全分析。

1. 信息收集

为达成对服务端的攻击,首先应对服务端进行“定位”。对服务端定位的常用方法有反编译APP、抓包分析、APP相关信息搜索、信息汇总分析等,具体如下:

一是反编译APP。这个过程可能会涉及到对APP进行脱壳等。反编译后,在反编译代码和资源文件中,利用字符串搜索和过滤,搜集所有链接等信息。除HTTP/HTTPS链接外,还应关注是否有FTP、登录凭证(比如邮箱账号,有些APP会发Crash信息等到邮箱)等信息。字符串搜索和过滤可以通过写脚本,或在自动化工具中对扫描规则进行配置等方式来完成。

二是抓包分析。一般移动APP和服务端通信使用HTTP(S),可使用抓包工具对传输数据进行抓包分析。抓包过程中我们可以手动点击APP中各功能菜单,或利用工具触发APP各种功能,通过抓包工具过滤或定制系统等方式尽量排除非受测APP的网络通信数据干扰(有些URL可能是第三方SDK官方地址,非授权渗透测试目标,应予以过滤)。

三是APP相关信息搜索。

  • 应通过互联网广泛搜索APP相关信息,若能找到其官网,应将其相关的官网、论坛的链接都搜集整理出来,若授权许可,亦可将其纳入到渗透的目标范围内。
  • 寻找该APP的历史版本,因为若该APP当前版本的安全加固措施做得比较到位,对其进行逆向分析较为复杂,但在某个时间节点前的历史版本可能是未加固的。
  • 可能会有其他意想不到的发现。

四是信息汇总分析。通过对收集到的信息综合筛选分析,形成一个信息集,包括但不限于URL、IP、使用的第三方SDK(下面展开说)等信息。

2. 网站/服务端渗透

这一阶段,与传统的Web渗透过程相同,测试人员通过各种嗅探工具对信息集中的URL、IP进行嗅探和漏扫,以期发现可能存在的漏洞等,并通过发现的漏洞(不管0day还是nday),尝试获取服务器的权限。因本章节重点是介绍如何结合APP做服务端渗透,所以这部分不详细展开。

3. APP功能分析

在信息收集阶段,测试人员已基本对APP功能有了一些了解,在这一环节,测试人员应实际试用APP,除了试用一些上传下载、聊天、留言等常用功能外,同时还应关注其相对冷门的功能,因为功能越冷门,开发人员对其的关注就越少,相应的服务端服务存在安全问题的可能性就越大。

4. 第三方SDK做分析

在信息收集环节中我们提到若无授权,测试人员不能随便对第三方SDK官网开展渗透测试,那为何还要对第三方SDK开展分析呢?原因是很多第三方SDK客户端和服务端是配套搭建的,有些部署在SDK官方服务端,有些则部署在SDK使用方(也就是APP官方服务端)。许多SDK官方会对其进行详细的说明,包括功能、部署方式、API等等。对于服务端SDK,测试人员可以将其下载下来(若无法探测到服务端版本号,可根据收集到的APP业务上线日期进行推测,并结合经验和已搜集到的信息,从下载的SDK挑选重要的SDK),对其进行历史漏洞搜索(该工作也可在信息收集环节开展)、扫描和分析,也许会发现一些有用的漏洞(0day最好,nday也要试一试,万一没补呢?)。

5. 账号安全和业务安全

最后,我们再谈谈账号安全和业务安全。这一环节在APP功能分析过程中也可能会涉及,其与渗透获取服务器shell权限可能没太大关系,但其从攻击者的角度来看却非常关键,因为大部分攻击者获取服务器shell权限的目的就是为了获取APP用户的数据或资料,当然也有单纯为了搞破坏和黑客炫技的情况存在。

在这一环节,测试人员要详细分析APP的账号机制和业务逻辑,随着APP官方与黑产对抗的加深,APP的业务逻辑和身份认证机制可能会做的很复杂。同时如果APP是使用用户数量大时间、上线时间比较久,存在账户安全问题(爆破、信息泄露、越权、绑定/换绑逻辑等等)的可能性相对要低很多;同理,越是成熟的业务,存在安全问题的概率就会越低,所以测试人员可以重点关注被测APP中可能存在的冷门或新上线业务。

随着移动APP安全攻防对抗逐渐加强,对其及相关服务端开展渗透测试,必然会越来越多的涉及逆向、调试、数据或流量解密等工作(虽然一些逻辑漏洞可通过分析其业务功能、流程发现,但实现漏洞利用一般还需进一步逆向和抓包分析)。渗透测试人员和团队应善于使用、定制或开发自动化工具辅助检测以节省时间和人力。

可以想象,一旦攻击者借助APP拿下了服务端,就可以反过来批量攻击APP(或用户),从而形成一个攻击闭环,且攻击者能做的事情还远不止这些!

六、结束语

以上就是笔者关于移动APP渗透测试的总结,希望能帮到大家,但限于知识和技术水平,会有许多不完善甚至不准确之处,还望多多指正。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-05-20
本文作者:极客安全MobileSecurity
本文来自:“cocoachina”,了解相关信息可以关注“cocoachina”

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
30天前
|
jenkins 测试技术 持续交付
提升软件测试效率的创新实践
在软件开发过程中,测试环节扮演着至关重要的角色。本文探讨了如何通过创新的方法和工具,提高软件测试的效率和质量。我们将从自动化测试、持续集成与持续部署(CI/CD)、测试驱动开发(TDD)三个方面,详细介绍这些技术如何改变传统的测试流程,帮助团队更快地发现和修复缺陷,最终实现更高质量的软件交付。
153 67
|
15天前
|
Java 测试技术 开发者
初学者入门:掌握单元测试的基础与实践
【10月更文挑战第14天】单元测试是一种软件测试方法,它验证软件中的最小可测试单元——通常是单独的函数或类——是否按预期工作。单元测试的目标是确保每个模块在其自身范围内正确无误地运行。这些测试应该独立于其他模块,并且应该能够反复执行而不受外部环境的影响。
41 2
|
23天前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
1月前
|
SQL 测试技术 持续交付
探索软件测试的多维度——从理论到实践
【9月更文挑战第35天】在软件工程的世界中,测试是一个不可或缺的环节。它不仅保障了软件产品的质量,而且确保了用户体验的一致性和可靠性。本文将从不同的角度切入,探讨软件测试的多个方面,包括测试的目的、类型、工具以及最佳实践。通过深入浅出的方式,我们旨在为读者提供一个全面的测试知识框架,帮助他们更好地理解并执行软件测试工作。
32 2
|
20天前
|
测试技术 UED
软件测试的艺术与实践
【10月更文挑战第9天】 在数字时代的浪潮中,软件成为了我们生活和工作不可或缺的一部分。然而,高质量的软件背后,是无数测试工程师的默默付出。本文将通过深入浅出的方式,探讨如何进行高效的软件测试,确保软件产品的质量与稳定性。我们将一起揭开软件测试的神秘面纱,从基础理论到实际操作,一步步走进这个充满挑战与创造的世界。
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
探索软件测试的边界:从基础到高级的实践之旅
【10月更文挑战第21天】 在当今数字化时代,软件已成为我们生活和工作中不可或缺的一部分。随着技术的快速发展,对软件质量的要求也日益提高。本文旨在通过深入浅出的方式,带领读者踏上一场从基础到高级的软件测试实践之旅。我们将探讨软件测试的基本概念、重要性以及如何有效地进行测试规划和执行。通过具体案例分析,揭示常见错误及其解决方案,同时展望未来软件测试领域的发展趋势。无论你是软件开发新手还是经验丰富的测试工程师,这篇文章都将为你提供宝贵的见解和启发。
24 8
|
6天前
|
监控 安全 jenkins
探索软件测试的奥秘:自动化测试框架的搭建与实践
【10月更文挑战第24天】在软件开发的海洋里,测试是确保航行安全的灯塔。本文将带领读者揭开软件测试的神秘面纱,深入探讨如何从零开始搭建一个自动化测试框架,并配以代码示例。我们将一起航行在自动化测试的浪潮之上,体验从理论到实践的转变,最终达到提高测试效率和质量的彼岸。
|
8天前
|
测试技术 C# 数据库
C# 一分钟浅谈:测试驱动开发 (TDD) 实践
【10月更文挑战第18天】测试驱动开发(TDD)是一种软件开发方法论,强调先编写测试代码再编写功能代码,以确保代码质量和可维护性。本文从 TDD 的基本概念入手,详细介绍了其核心步骤——编写测试、运行测试并失败、编写代码使测试通过,以及“红绿重构”循环。文章还探讨了 TDD 的优势,包括提高代码质量、促进设计思考、减少调试时间和文档化。此外,文中分析了常见问题及解决方案,如测试覆盖率不足、测试代码过于复杂、忽视重构和测试依赖过多,并通过一个简单的计算器类的代码案例,展示了 TDD 的实际应用过程。
21 1
|
15天前
|
机器学习/深度学习 人工智能 自然语言处理
探索AI在软件测试中的创新应用与实践###
本文旨在探讨人工智能(AI)技术如何革新软件测试领域,提升测试效率、质量与覆盖范围。通过深入分析AI驱动的自动化测试工具、智能化缺陷预测模型及持续集成/持续部署(CI/CD)流程优化等关键方面,本研究揭示了AI技术在解决传统软件测试痛点中的潜力与价值。文章首先概述了软件测试的重要性和当前面临的挑战,随后详细介绍了AI技术在测试用例生成、执行、结果分析及维护中的应用实例,并展望了未来AI与软件测试深度融合的趋势,强调了技术伦理与质量控制的重要性。本文为软件开发与测试团队提供了关于如何有效利用AI技术提升测试效能的实践指南。 ###
|
24天前
|
测试技术
软件测试中的探索性测试(ET)实践
【10月更文挑战第5天】本文将深入探讨一种与传统脚本化测试不同的测试方法——探索性测试(Exploratory Testing,简称ET)。我们将通过一个实际案例来展示ET的有效性,并分享如何将ET融入日常的软件测试流程中。文章旨在为测试人员提供一种灵活、高效的测试策略,帮助他们更好地发现软件中的缺陷。