
# PS: 以下所有操作的工具,所在路径中尽量都不要包含中文
# 工具一:jadx-gui
# 下载链接(下载 jadx-gui-1.5.1-with-jre-win.zip )
https://github.com/skylot/jadx/releases/tag/v1.5.1
# 工具二:Apktool
# 下载链接
https://apktool.org/
# 工具三:keytool
# 下载链接(下载 jadx-gui-1.5.1-with-jre-win.zip )
https://github.com/skylot/jadx/releases/tag/v1.5.1
# jdax-gui 目录下\jre\bin 中自带一个 keytool.exe
| |
---|
客户端程序安全 |
| | |
---|
| 描述 && 检测方法 | 防御方式 | 反编译 |
- 描述:APK —> 源代码
- 检测方法:通过使用反编译工具看能否对APP进行反编译
| |
---|
jadx-gui | # 描述:图形化界面一键获取源码,多用于查看 | apktool | # 描述:命令行界面,多用于修改和打包
# 语句
java -jar apktool_2.10.0.jar d apk文件.apk -o 输出文件名
# 举例
java -jar apktool_2.10.0.jar d wns.apk -o wns |
| APP加密,代码混淆,加壳 | 重打包/签名 |
apktool |
| keytool / jarsigner |
- 描述:包名相同的两个APK会被认为是同一应用,当新版本覆盖旧版本时,签名证书必须一致,否则会被拒绝安装
- 检测方法:通过进行签名对比 或 签名校验
-
# 伪造签名 # 第一步:生成证书 # 语句
keytool -genkey -alias 证书别名 -keyalg 密钥加密算法 -validity 证书有效天数 -keystore 生成的证书路径 # 举例
keytool -genkey -alias alias -keyalg RSA -validity 36500 -keystore new.keystore # 回车后输入密钥口令,姓氏、单位名称、组织名称等信息 # 不做特殊用途的话,随便输入就行了(记住密码,签名时用) # 最后 Y/y 确认,会在目录下生成证书文件 -
# 第二步:签名 # 语句
jarsigner -verbose -keystore 生成的证书路径 -signedjar 签名后apk文件名 未签名apk文件名 证书别名 # 举例
jarsigner -verbose -keystore new.keystore -signedjar wns_sign.apk wns.apk alias # PS:jarsigner 错误: java.lang.RuntimeException: 密钥库加载: Invalid keystore format # 如果你遇到上面这个问题,确认参数如上,不用听网上什么绝对路径,参数错误,工具问题 # 检查一遍jarsigner路径中是否包含中文,有的话换个路径就行了; -
# 其他 # 提取证书
keytool -printcert -jarfile apk文件名 -
# 其他 # 签名校验(若看到CN=发布方,则判定为无风险;若CN=Debug证书、第三方(开发方)证书则判定为高风险) # 简略
jarsigner.exe -verify APK文件路径 # 详细
jarsigner.exe -verify APK文件路径 -verbose -certs
|
| 验证APP签名,签名对比(获取二次打包后APP的签名与正确的APP签名进行对比) | 组件安全 |
| |
---|
组件 | 防御 | 行为 / Activity (交互界面) | 如果组件不需要与其他App共享数据或交互,则将 android:exported 设为 false ; | 服务 / Service (后台作业) | 在 AndroidMenifest.xml 中将相应组件的 android:exported 属性设为 false ; | 内容提供者 / ContentProvider (共享数据) | AndroidManifest.xml 文件的各Provider 标签中,设置 android;exported="false" | 广播接收者 / Broadcast Receiver (获取广播信息) | 在 AndroidManifest.xml 文件的各 Receiver 标签中,设置 android:exported="false" |
- 检测方法:通过反编译查看
AndroidManifest 文件(或直接扫描暴露组件),分析反编译相关的组件代码,查看是否存在漏洞并进行验证;
- PS:
AndroidManifest.xml 文件,是Android 应用的核心配置文件,内容包含APP的基本信息(manifest ),组件(application ),活动(activity )以及权限(uses-permission );
| 检测组件是否可以被外部应用调用 |
|
敏感信息安全 |
| | |
---|
威胁 | 描述&&检测方法 | 防御 | APP 所在目录文件权限 |
- 描述:由于权限配置不当,导致普通用户可以读写APP目录下的 本地存储数据 或 运行日志;
- 检测方法:
ls -al 查看App目录文件权限,查看其他组成员是否允许读写(普通文件后3位为-,目录则可以多一个执行。例: rw-rw---- , rwxrwx--x );
| 检查APP所在目录,设置其权限不允许其他用户读写; | SQLite 数据库文件的安全性 |
- 描述:
SQLite 数据库 /data/data/包名/databases 下存在未授权; - 检测方法:查看
/data/data/包名/databases 下的数据库文件是否包含敏感信息;
| 对数据库信息进行加密存储 | Logcat 日志 |
- 描述:客户端的
Logcat 日志会保存一些敏感信息; - 检测方法:尝试使用
adb logcat -v time > 保存路径 命令或 DDMS 工具,获取 Logcat 信息
| 关闭敏感信息调试开关 | 敏感数据明文存储于Sdcard |
- 描述:为了实现持久化存储,部分Android会将数据存储到外部(
/sdcard, /mnt/sdcard ),但这可能会导致同一设备的不同app对其进行读取和修改; - 检测方法:查看代码是否有保存到外部存储设备;
| 存储到外部前,对数据进行加密 |
|
安全策略 |
| |
---|
威胁 | 防御方式 | 密码复杂度 | 不允许设置弱密码,如大小写,字母,数字 | 认证失败锁定策略 | 连续认证失败5次,则锁定账号 | 单点登录限制策略 | 同一时间一个账号只能在一个地方登录 | 会话超时策略 | 设置会话超时时间,例30分钟 | 界面切换保护 | 当该APP切换到后台时,是否会模糊,清空表单和会话,防止信息泄露,并且返回时是否需要再认证(手势,密码等) | 错误提示 | 账号密码输入错误均提示"账号或密码错误" | 安全退出 | 退出登录时,服务端及时清除session; | 密码修改验证 | 修改密码前进行身份验证; |
|
密码安全 |
| | | 威胁 | 描述&&检测方法 | 防御方式 | 键盘劫持 |
- 描述:通过特殊的病毒(键盘监听病毒,输入法劫持病毒等) 或 自定义的恶意键盘,记录用户的键盘输入;
- 检测方法:通过观察输入敏感信息时,是否会使用自定义的恶意键盘;
| 使用安全的输入法 或 键盘随机化处理 | 屏幕截屏 / 录像 |
- 描述:通过其他恶意进程 或 APP内的恶意功能持续截屏录像发送;
- 检测方法:通过连接截屏/录像,观察是否可以捕捉到用户输入的密码;
| 防止连续截图,敏感信息页禁止截图 | 手势密码 |
| |
---|
策略 | 防御方式 | 手势密码修改和取消 | 手势密码修改前需进行认证 | 手势密码本地信息保存 | 手势密码本地信息加密存储 | 手势密码锁定策略 | 多次认证失败锁定账号 |
| |
|
进程保护 |
| | 威胁 | 描述 | 注入 |
- 描述:将一段代码或一段完整的可执行程序加载到目标程序中
| Hook |
|
|
其他 |
Webview漏洞 |
|
- 设置activity不可被导出 明确
- 禁止WebView 使用 File 协议
| 界面劫持 |
- 描述:通过伪造
Activity 并添加标志位 FLAG_ACTIVITY_NEW_TASK ,使伪造的恶意界面覆盖原界面,实现劫持获取敏感数据; - 检测方法:通过检测最前端的
Activity 应用是不是APP本身的或者是系统应用;
|
| 本地拒绝服务 |
- 描述:通过
Intent 机制发送空数据,异常数据和畸形数据给受害者应用,导致其崩溃;
- PS:
Intent 机制:对APP中的动作,动作涉及的数据 和 附加数据进行描述; Android 系统则根据此Intent 的描述,负责找到对应的组件,将Intent 传递给调用的组件,并完成组件的调用;
- 检测方法:通过
Android 扫描工具进行扫描;
|
- 使用
try catch 捕获异常; - 将不必要的组件设为不导出;
| 应用数据可备份 |
- 描述:当
AndroidManifest.xml 文件中 allowBackup 为 Ture 时用户即可通过 adb backup 和 adb restore 命令来进行对应用数据的备份和恢复,不过这种设置可能会组成一定的风险; - 检测方法:通过查看
AndroidManifest.xml 文件中是否有 allowBackup ,如果没有则 allowBackup 属性值,默认 allowBackup 值为True,则默认为可以备份应用数据,存在安全风险;如果allowBackup 属性值为false ,则不可以备份应用数据。
|
- 将APP的
AndroidManifest.xml 中的 allowbackup 属性设为 False
| debug调试 |
|
- 关闭debug调试功能
android:debuggable=false
| Janus 安卓签名漏洞 |
- 描述:攻击者可以绕过安卓系统的
signature scheme V1 签名机制,进而直接对app进行篡改 - 检测方法:检测
META-INF 目录下签名文件是否完整;
|
- App使用signature scheme V2及以上版本签名机制;
| Root环境检测 |
- 描述:在
mobile 应用启用 certificate pinning 的情况下使用 Rooted 手机+xposed+justtrustme 组件依然可以通过API hook 进行中间人攻击。 监控客户端与后台的通信内容 - 检测方法:检测系统文件权限 和 应用程序权限,是否为root;
|
- 应用启动时检测手机环境,确保为非root环境
- 检测如
xposed 、 Cydia Substrate 、frida 等逆向工具是否运行时,弹窗提醒用户设备已root
| 模拟器环境检测 |
- 描述:攻击者可以用模拟器运行、多开、调试、攻击程序;
- 检测方法:检测设备型号,硬件信息,操作系统版本等,或调用特定的API检测模拟器环境;
|
| 代理环境检测 |
- 描述:攻击者通过设置代理的方式,抓取客户端与服务器之间的数据包
- 检测方法:检测系统,网络连接设置和
HTTP 请求头信息,查看是否配置了代理服务器
|
|
|
| | |
---|
威胁 | 描述 | 防御方式 |
数据窃听 |
- APP与服务端通信过程中,未对数据进行加密性保护;
- 例如:很多APP与服务端在不安全的传输通道中直接使用HTTP协议通信;
- 检测方法:Burp抓包,查看通信信息是否加密,并且如果抓包是APP自动退出,则描述APP有做证书校验;
|
- 使用HTTPS等加密协议进行通信,确保数据传输的安全性
|
数据篡改 |
- 描述:APP与服务端通信过程中,未对数据进行完整性保护;
|
|
数据重放 |
- 描述:APP与服务端通信过程中,未对数据进行一次性令牌保护;
|
|
证书绑定 |
- 描述:攻击者通过替换证书解密客户端与服务端之间的数据
|
|
| |
---|
威胁 | 描述 |
不安全的中间件 |
|
认证与会话管理 |
| |
---|
威胁 | 防御方式 | 短信/邮箱轰炸 |
| 用户枚举 |
| 暴力破解 |
| 验证码 |
| |
---|
策略 | 防御 | 验证码取消回显 | 验证码前端回显漏洞 | 验证码有效次数,例1次 | 验证码复用漏洞 | 验证码绑定用户信息 | 验证码未绑定漏洞 | 验证码链接隐藏(防止爆破) | 验证码爆破漏洞 | 验证码有效期,例3分钟 | 验证码超时可用漏洞 | 设置验证码 | 空验证码绕过漏洞 |
漏洞参考文章:3.6_逻辑漏洞-CSDN博客 |
|
访问控制 |
| | 威胁 | 测试方法 | 水平越权 | 原理:程序在对数据进行操作时,未能正确验证用户的身份信息;
- 修改个人资料时,抓取数据包寻找特定参数,修改特定参数即可查看或修改其他用户信息,则存在平行越权;
(可能需要看页面源码,并自己添加特定的参数) |
| 垂直越权 | 原理:程序在对数据进行操作时,未能正确验证用户的权限级别;
- 登录管理员账户和普通用户,先获得普通用户的Cookie;
- 再访问管理员修改用户的功能点抓包,将数据包中的Cookie替换为普通用户的Cookie,如果操作成功则存在垂直越权:
- 或是修改其他参数可以获取只有管理员能够访问的数据;
|
|
|
注入 |
|
应用层拒绝服务攻击 |
- 描述:通过并发大量的请求,造成系统资源耗尽,导致服务器拒绝服务;
|
密码算法和密钥管理 |
- 描述:采用弱加密算法导致信息泄露(如
MD5 ,DES 算法) - 检测方法:反编译后查看源码,查找敏感数据和敏感函数加密代码是否使用弱加密
- 防御方式
- 使用对称加密算法时避免使用
DES 算法,可以选择3DES IvParameterSpec 初始化时,不使用常量vector - 使用
RSA 算法加密时,指定Padding 模式,建议密钥长度>1024 bit
|
# 抓模拟器的包
# 步骤(文字版)
打开模拟器 ——> 下拉并点击设置 ——> 点击WLAN ——> 长按 wiredSSID,点击修改网络
——> 依次点击高级选项,代理,设置为手动 ——> 对主机名和端口进行修改(与Burp设置的IP和端口一致)
——> 模拟器的浏览器访问 http://burp/ ,点击 CA certxxx (后缀为der) ——> 点击模拟器工具栏中下载
——> 长按修改下载der文件后缀为cer ——> 模拟器回到桌面设置找到安全 ——> 点击从SD卡安装
——> 安装,修改名称,确定 ——> 打开app,使用Burp抓包;
# PS:使用的是夜神模拟器,下载链接:https://www.yeshen.com/
- 打开模拟器下拉并点击设置

- 点击WLAN

- 长按 wiredSSID ,点击修改网络

- 依次点击高级选项,代理,设置为手动

- 对主机名和端口进行修改 (与Burp设置的IP和端口一致)

- 模拟器的浏览器访问 http://burp/ , 点击
CA certxxx
(下载后缀为der的证书 ), 
- 返回桌面,找到下载的
cacert.der
, 



- 将后缀改为cer


- 模拟器回到桌面设置找到安全


- 点击从SD卡安装

- 点击,安装

- 名称任意,确定,安装成功

- 打开app,使用Burp抓包

-
APP漏洞扫描器:Yaazhini
&& ApplicationScanner(kali)
| |
---|
漏洞扫描器 | 描述 |
Yaazhini | # 作用:Android APK 和 API 漏洞扫描器
# 下载链接:https://www.vegabird.com/yaazhini/
# 下载后会要求你填入邮箱获取免费版
# 电脑端打开邮箱内的链接,会显示 Window OS.exe 和 Mac.dmg 俩个版本
# 根据自己需求选即可
# 使用方式:双击运行,填入参数,等待结果
   |
ApplicationScanner(kali) | # 作用:apk扫描器(不支持Windows)
# 下载链接:https://github.com/paradiseduo/ApplicationScanner
# 参数说明:
-i 指定apk文件 -s 保存.cache文件(默认删除)
-l 选择语言zh,en(默认zh中文) -f 指定字串文件(会特别关注)
# -f 举例:python AppScanner.py -i 5555.apk -f checklist
# checklist文件内容:
dlsym
dlopen
respondsToSelector
performSelector
method_exchangeImplementations
支付宝
微信
# 使用
pip3 install -r requirement.txt
python AppScanner.py -i apk路径
# 常用语句
python AppScanner.py -i apk路径
# 举例
python AppScanner.py -i 5555.apk
 |
APP安全服务平台:腾讯御安全,阿里聚安全,360显危镜,梆梆,娜迦,爱加密等;
- 移动APP安全测试:移动APP安全测试 - AAA五金批发王建军 - 博客园
- 安卓APP客户端渗透测试指南:https://jenchoi.top/2023/android-app-client-pentest-guide/#WebView组件远程代码执行
- App安全测试—Android安全测试规范:App安全测试—Android安全测试规范-腾讯云开发者社区-腾讯云
- APP渗透测试漏洞实战教程:爱住了 | APP渗透测试漏洞实战教程-CSDN博客
- 渗透测试之App安全测试详解:渗透测试之App安全测试详解_app渗透测试-CSDN博客
- Android APP常见漏洞和挖掘技巧 PART1:Android APP常见漏洞和挖掘技巧 PART1 | Clang裁缝店
- Android APP常见漏洞和挖掘技巧 PART2:Android APP常见漏洞和挖掘技巧 PART2 | Clang裁缝店
-
本专栏内容仅供参考,不构成任何投资、学习或专业建议。读者在参考本专栏内容时,应结合自身实际情况,谨慎作出决策。
-
本专栏作者及发布平台尽力确保内容的准确性和可靠性,但无法保证内容的绝对正确。对于因使用本专栏内容而导致的任何损失,作者及发布平台概不负责。
-
本专栏部分内容来源于网络,版权归原作者所有。如有侵权,请及时联系我们,我们将尽快予以处理。
-
读者在阅读本专栏内容时,应遵守相关法律法规,不得将内容用于非法用途。如因读者行为导致不良后果,作者及发布平台不承担任何责任。
-
本免责声明适用于本专栏所有内容,包括文字、图片、音频、视频等。读者在阅读本专栏内容时,视为已接受本免责声明。
-
作者及发布平台保留对本免责声明的解释权和修改权,如有变更,将第一时间在本专栏页面进行公告。读者继续使用本专栏内容,视为已同意变更后的免责声明。
敬请广大读者谅解。如有疑问,请联系我们。谢谢!