APP与小程序安全测试架构分析
一、课程概述
1.1 核心定位
-
前置知识:网站架构安全(WAF/CDN/OSS/反向代理/负载均衡)
-
本节课目标:理解APP与小程序的四种开发架构,明确不同架构对应的安全测试方法论
-
核心原则 :开发架构决定测试思路------不同技术栈对应完全不同的渗透测试路径
1.2 四种开发架构总览
表格
| 架构类型 | 技术栈 | 核心特征 | 测试重点 |
|---|---|---|---|
| Web封装 | PHP/Java/.NET等后端语言 | 网站套壳,无独立开发 | 等同于Web渗透测试 |
| 原生开发 | Java(Android)/Objective-C(iOS) | 独立编码,完整功能 | 反编译+抓包提取资产 |
| H5开发 | HTML5静态页面 | 纯前端展示 | 接口安全测试 |
| H5+Vue混合开发 | HTML5 + Vue.js框架 | 前后端分离架构 | JS框架漏洞+API接口测试 |
二、Web封装开发(网站套壳)
2.1 核心原理
定义 :将现有Web应用通过封装平台直接转换为APP安装包,无独立开发过程
技术本质:
plain
复制
Web应用(已有网站)
↓
封装平台(一门APP/变色龙等)
↓
生成APP安装包(Android/iOS)
↓
用户安装后通过WebView加载原网站
2.2 封装平台操作流程
环境准备:
-
已有Web应用(如ShopXO商城、WordPress博客)
-
封装平台账号(一门APP、变色龙等)
-
应用图标、启动图等素材
封装步骤:
Markdown
复制
代码预览
1. 登录封装平台(如https://sapp.app)
2. 创建新应用 → 选择"Web封装"类型
3. 填写目标网站URL(如https://shop.xxx.com)
4. 配置应用信息:
- 应用名称、图标、启动图
- 版本号、包名
- 是否支持缩放、是否显示导航栏
5. 选择生成平台(Android/iOS)
6. 提交编译 → 等待生成安装包(APK/IPA)
7. 下载安装包 → 安装测试
2.3 安全测试特征
核心结论 :Web封装APP = 原网站,测试方法完全等同于Web渗透
表格
| 测试维度 | Web封装APP | 原生APP | 差异说明 |
|---|---|---|---|
| 漏洞类型 | SQL注入、XSS、文件上传等 | 逻辑漏洞、组件漏洞、逆向漏洞 | 封装APP无独立漏洞面 |
| 测试工具 | BurpSuite、SQLMap、Dirsearch | IDA Pro、Frida、JADX | 封装APP无需移动端工具 |
| 资产识别 | 直接分析网站URL | 需反编译提取隐藏资产 | 封装APP资产透明 |
| 权限获取 | 网站GetShell即控制APP | 需突破应用沙箱 | 封装APP无额外防护 |
识别特征:
-
界面与网站完全一致,仅适配移动端显示
-
功能与网站无差异,无独立原生功能(如摄像头、蓝牙调用)
-
网络请求全部指向原网站域名
三、原生开发(Native)
3.1 核心概念
定义 :使用平台专属编程语言独立开发,不依赖Web技术
技术栈:
-
Android:Java/Kotlin + Android SDK
-
iOS:Objective-C/Swift + iOS SDK
3.2 与Web封装的本质差异
表格
| 对比维度 | 原生开发 | Web封装 |
|---|---|---|
| 界面设计 | 独立XML/Storyboard布局 | 复用Web页面CSS样式 |
| 功能实现 | 调用系统API(相机、GPS、蓝牙) | 受限于WebView能力 |
| 性能体验 | 流畅,响应速度快 | 依赖网络,可能出现卡顿 |
| 开发成本 | 高(需掌握平台语言) | 极低(仅需提供URL) |
| 代码形态 | 编译后的DEX/Mach-O二进制 | WebView+HTML+JS |
| 逆向难度 | 需专业反编译工具 | 直接看到网站源码 |
3.3 安全测试方法论
核心思路 :反编译提取静态资产 + 抓包分析动态流量 → 对提取资产进行定向测试
3.3.1 反编译技术
工具链:
表格
| 工具 | 用途 | 适用场景 |
|---|---|---|
| JADX | Java反编译,还原DEX为可读Java代码 | Android APK分析 |
| GDA | 图形化反编译工具,支持交叉引用 | 快速定位关键代码 |
| IDA Pro | 二进制逆向,支持ARM/x86汇编 | 深度分析、Native层 |
| Frida | 动态插桩,Hook运行时方法 | 绕过反调试、抓加密流量 |
反编译目标:
java
复制
// 典型需关注的代码片段
// 1. 硬编码密钥
private static final String API_KEY = "sk-1234567890abcdef";
// 2. 后端接口地址
public static final String BASE_URL = "https://api.music.xxx.com/v1";
// 3. 数据库连接信息
String dbHost = "10.0.0.5";
String dbUser = "root";
String dbPass = "password123";
// 4. 加密算法实现(AES/DES/RSA密钥)
SecretKeySpec key = new SecretKeySpec("0123456789ABCDEF".getBytes(), "AES");
3.3.2 抓包分析技术
工具链:
表格
| 工具 | 协议支持 | 核心功能 |
|---|---|---|
| BurpSuite | HTTP/HTTPS | Web流量拦截、重放、爆破 |
| Charles | HTTP/HTTPS/WebSocket | 移动端友好,支持SSL代理 |
| Wireshark | 全协议(TCP/UDP/ICMP等) | 底层网络分析 |
| tcpdump | 全协议 | 命令行抓包,服务器端使用 |
抓包配置要点:
bash
复制
# 1. 移动端代理设置(以Android为例)
设置 → WLAN → 长按当前网络 → 修改网络
→ 高级选项 → 代理 → 手动
→ 服务器主机名:Burp所在PC的IP
→ 服务器端口:8080
# 2. 证书安装(HTTPS抓包必需)
Burp → Proxy → Options → Export CA Certificate
→ 发送到手机 → 设置 → 安全 → 从存储安装
# 3. 绕过SSL Pinning(APP证书校验)
使用Frida脚本:
frida -U -f com.target.app -l ssl-pinning-bypass.js --no-pause
3.3.3 完整测试流程
Mermaid
全屏
下载
复制
代码预览
获取目标APP反编译APK提取静态资产域名/IP/接口/密钥运行时抓包分析动态流量发现隐藏接口/参数资产整合定向安全测试Web渗透/API测试/服务漏洞
四、H5开发与H5+Vue混合开发
4.1 H5开发(纯静态)
技术特征:
-
纯HTML5 + CSS3 + JavaScript
-
无后端交互或仅通过AJAX请求数据
-
内容静态展示为主
安全测试重点:
-
前端漏洞:XSS(反射型/存储型)、CSRF、点击劫持
-
接口安全:若存在数据接口,测试未授权访问、IDOR
-
第三方组件:jQuery、Bootstrap等历史漏洞
4.2 H5+Vue混合开发(前后端分离)
技术栈:
plain
复制
前端:Vue.js/React/Angular + HTML5 + CSS3
↓
通信:RESTful API / GraphQL / WebSocket
↓
后端:Node.js/Python/Java/Go(提供JSON数据)
与常规Web应用的核心差异:
表格
| 维度 | 传统Web(PHP/JSP/ASP) | H5+Vue前后端分离 |
|---|---|---|
| 渲染方式 | 服务端渲染(SSR) | 客户端渲染(CSR) |
| 数据交互 | 表单提交,页面跳转 | AJAX异步请求,无刷新 |
| 漏洞类型 | SQL注入、RCE、文件包含 | XSS、IDOR、API未授权 |
| 代码位置 | 服务端不可见 | 前端JS完全暴露 |
| 测试重点 | 服务端逻辑 | API接口+前端逻辑 |
4.3 Vue.js应用安全测试
典型漏洞点:
表格
| 漏洞类型 | 成因 | 检测方法 |
|---|---|---|
| XSS(Vue特定) | v-html指令渲染未过滤内容 |
搜索v-html使用点,测试富文本输入 |
| API未授权 | 前端路由守卫绕过,后端未校验 | 直接请求API端点,不带Token测试 |
| 敏感信息泄露 | config.js硬编码API密钥 |
检查src/config/、public/目录 |
| CORS配置不当 | Access-Control-Allow-Origin: * |
抓包检查响应头 |
| 路由绕过 | 前端路由鉴权,后端未校验 | 直接访问/#/admin等管理路径 |
测试工具:
bash
复制
# Vue DevTools(浏览器扩展)
# 查看组件树、Vuex状态、路由信息
# 源码分析
npm run build # 生成生产包
source-map-explorer dist/static/js/*.js # 分析打包内容
# API测试
curl -X POST https://api.target.com/v1/user \
-H "Content-Type: application/json" \
-d '{"id":1}' # 测试IDOR
五、小程序开发架构与安全测试
5.1 小程序的两种开发模式
表格
| 模式 | 技术实现 | 测试方法 | 典型场景 |
|---|---|---|---|
| Web封装小程序 | 平台将网站直接转为小程序 | 等同于Web渗透测试 | 快速上线、功能简单 |
| H5+Vue原生开发 | 使用微信开发者工具,WXML+WXSS+JS | 前端代码审计+API测试 | 功能复杂、体验要求高 |
5.2 小程序特有安全机制
表格
| 机制 | 说明 | 测试影响 |
|---|---|---|
| 域名白名单 | 小程序只能访问配置的合法域名 | 需配置Burp代理域名或在开发者工具中关闭校验 |
| HTTPS强制 | 所有网络请求必须HTTPS | 需安装证书,或开启"不校验合法域名" |
| 代码包加密 | 上传后微信加密存储 | 本地可获取明文源码,线上需解密 |
| 云函数 | 部分逻辑在腾讯云执行 | 需关注云函数权限配置、数据库规则 |
5.3 小程序测试环境搭建
bash
复制
# 1. 安装微信开发者工具
# 下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html
# 2. 获取小程序源码(三种方式)
# 方式A:开发者直接提供源码
# 方式B:从手机端提取(需Root)
# 方式C:使用解密工具(如wxappUnpacker)
# 3. 导入项目
# 开发者工具 → 导入项目 → 选择小程序目录
# AppID:可选择测试号(无真实AppID时使用)
# 4. 调试配置
# 详情 → 本地设置 → 勾选:
# □ 不校验合法域名、web-view(业务域名)、TLS版本以及HTTPS证书
# □ 不校验安全域名
# 5. 抓包配置
# 电脑端开启Burp/Charles代理
# 开发者工具 → 设置 → 代理 → 使用系统代理/手动设置代理
六、架构识别与测试策略选择
6.1 快速识别方法
表格
| 识别维度 | Web封装 | 原生开发 | H5/Vue |
|---|---|---|---|
| 界面流畅度 | 有卡顿,加载等待 | 流畅,即时响应 | 取决于复杂度 |
| 网络依赖 | 强依赖,无网无法使用 | 可离线使用部分功能 | 通常需联网 |
| 系统功能 | 无法调用(相机/蓝牙等) | 完整调用系统API | 需JSBridge支持 |
| 界面元素 | 网页特征(可缩放、有滚动条) | 原生组件(固定布局) | 混合特征 |
| 包体大小 | 极小(仅WebView壳) | 较大(含完整代码) | 中等(含JS框架) |
6.2 确定性识别:反编译分析
bash
复制
# Android APK结构分析
unzip target.apk -d target_folder
cd target_folder
# Web封装特征
ls assets/www/ # 存在HTML/JS/CSS文件
# 或
ls res/raw/ # 存在本地网页资源
# 原生开发特征
ls lib/arm64-v8a/ # 存在.so原生库
# 且
find . -name "*.dex" | xargs strings | grep -i "android/app/Application"
# H5/Vue特征
ls assets/dist/ # 存在Vue打包后的静态资源
# 查看JS文件内容含"vue"、"webpack"等关键字
6.3 测试策略决策树
plain
复制
开始测试APP
↓
反编译获取代码? ──是──→ 存在大量Java/OC代码 ──→ 原生开发
↓否 ↓
存在assets/www/或WebView配置 ──是──→ Web封装 ──→ 直接Web渗透
↓否
存在Vue/React/Angular特征 ──是──→ H5+Vue ──→ JS审计+API测试
↓否
纯HTML/JS/CSS ──是──→ H5静态 ──→ 前端漏洞测试
↓否
无法识别 ──→ 抓包分析流量特征 ──→ 根据协议类型选择工具
七、核心工具与命令速查
7.1 反编译工具链
bash
复制
# JADX(推荐)
jadx -d output_folder target.apk
# 输出可读Java代码到output_folder
# apktool(资源提取)
apktool d target.apk -o apktool_output
# 提取AndroidManifest.xml、资源文件等
# dex2jar(旧方案)
d2j-dex2jar.sh target.apk
# 生成target-dex2jar.jar,再用JD-GUI打开
7.2 抓包工具配置
bash
复制
# tcpdump服务器端抓包(需Root)
tcpdump -i any -w capture.pcap port 80 or port 443
# Frida Hook脚本示例(绕过SSL Pinning)
Java.perform(function() {
var array_list = Java.use("java.util.ArrayList");
var TrustManagerImpl = Java.use("com.android.org.conscrypt.TrustManagerImpl");
TrustManagerImpl.checkTrustedRecursive.implementation = function() {
return array_list.$new();
};
});
7.3 小程序工具
表格
| 工具 | 用途 | 获取方式 |
|---|---|---|
| 微信开发者工具 | 小程序调试、源码查看 | 官方下载 |
| wxappUnpacker | 小程序包解密、反编译 | GitHub开源 |
| Postman/Apifox | API接口测试 | 官方下载 |
| Charles | 小程序HTTPS抓包 | 官方下载 |
八、可复现实验流程
实验1:Web封装APP生成与测试
目标:验证Web封装APP与网站的一致性
步骤:
Markdown
复制
代码预览
1. 准备目标网站(如ShopXO商城)
2. 登录"一门APP"或"变色龙"平台
3. 创建应用 → 选择Web封装 → 输入网站URL
4. 配置应用图标、启动图
5. 生成Android APK
6. 安装到模拟器/真机
7. 抓包分析:确认所有请求均指向原网站
8. 结论:测试方法完全等同于网站渗透
实验2:原生APP反编译与资产提取
目标:掌握JADX反编译与关键信息定位
步骤:
Markdown
复制
代码预览
1. 获取目标APK(如仿网易云音乐APP)
2. 使用JADX打开APK
3. 全局搜索关键词:
- "http://" / "https://" → 提取URL
- "api" / "接口" → 定位API定义
- "key" / "secret" / "password" → 提取密钥
- "database" / "mysql" / "redis" → 数据库信息
4. 分析AndroidManifest.xml:
- 查看包名、权限声明、组件暴露情况
5. 运行时抓包,对比静态分析与动态流量
6. 对提取的资产进行定向测试
实验3:Vue.js小程序源码审计
目标:理解H5+Vue架构的安全测试点
步骤:
Markdown
复制
代码预览
1. 使用HBuilderX创建Vue项目
2. 编写包含以下漏洞的示例代码:
- v-html导致的XSS
- 未授权API调用
- 硬编码API密钥
3. 编译为微信小程序
4. 使用微信开发者工具导入
5. 审查源码,定位漏洞点
6. 使用开发者工具调试,验证漏洞
九、本章核心考点总结
简答题高频考点
表格
| 考点 | 标准答案要点 | 考察频率 |
|---|---|---|
| 四种APP开发架构及测试方法 | ①Web封装=网站测试 ②原生=反编译+抓包提取资产 ③H5=前端漏洞+接口测试 ④H5+Vue=JS框架漏洞+API测试 | ⭐⭐⭐⭐⭐ |
| 原生APP与Web封装的核心区别 | 原生:独立编码,需反编译分析 封装:网站套壳,直接Web渗透 识别:界面流畅度、系统功能调用、包体分析 | ⭐⭐⭐⭐⭐ |
| Vue.js应用与传统Web漏洞差异 | Vue:前后端分离,重点XSS/IDOR/API未授权 传统:服务端渲染,重点SQL注入/RCE/文件包含 | ⭐⭐⭐⭐ |
| 小程序两种开发模式 | ①Web封装:平台转换,等同网站测试 ②原生开发:WXML+WXSS+JS,需代码审计 环境:微信开发者工具+抓包配置 | ⭐⭐⭐⭐ |
| 反编译与抓包的互补性 | 反编译:静态资产(硬编码、未使用接口) 抓包:动态资产(实际通信、加密流量) 结合:全面覆盖目标攻击面 | ⭐⭐⭐⭐ |
实操题高频场景
-
架构识别:给定APK,判断是原生/Web封装/H5,并说明测试思路
-
反编译分析:使用JADX提取APP中的API接口和密钥
-
抓包绕过:配置Frida绕过SSL Pinning,抓取HTTPS流量
-
小程序测试:配置微信开发者工具,进行源码审计和API测试
-
Vue漏洞挖掘:分析Vue.js应用,发现XSS或API未授权漏洞
关键记忆口诀
plain
复制
封装APP是网站,直接渗透别多想
原生开发要反编,抓包提取资产忙
H5纯静态看接口,Vue前后端要分离
小程序分两种型,封装原生各不同
反编译看静态码,抓包看动态流量
两者结合全覆盖,测试思路要清晰
