记一次小程序加解密测试
字数 1522 2025-08-20 18:17:47
小程序加解密测试实战指南
1. 前言
随着小程序的普及,越来越多的应用迁移到小程序平台,随之而来的安全测试需求也日益增加。在小程序测试过程中,经常会遇到数据包被加密的情况,导致无法进行常规的渗透测试。本指南将详细介绍如何提取小程序前端源码并分析其中的加解密方法,从而实现对加密数据包的测试。
2. 小程序前端源码提取
2.1 获取wxapkg包
小程序的前端源码存放在微信安装包的wxapkg包中,获取步骤如下:
- 准备一台root手机或使用夜神等安卓模拟器
- 使用adb进入目录:
/data/data/com.tencent.mm/MicroMsg/appbrand/pkg/ - 通过
ls -al命令根据小程序安装时间判断并提取相应的wxapkg包
注意:wxapkg文件名是随机的,需要通过时间戳来判断具体文件。
2.2 反编译wxapkg文件
wxapkg是二进制文件,需要反编译才能获取前端源码。推荐使用以下工具:
- CrackMinApp:图形化操作界面,包含所需依赖环境
- 安装方法:参考其GitHub项目页面
反编译后可以得到完整的前端源码结构,便于后续分析。
3. 加解密方法分析
3.1 定位加解密函数
在前端源码中搜索以下关键词快速定位加解密方法:
encryptdecryptAESDESRSA
经验分享:大多数小程序使用对称加密,其中AES出现的频率最高。
3.2 常见加密模式
在测试案例中发现使用的是AES ECB模式,密钥为abcdef0123456789。这种模式相对不安全,容易受到攻击。
4. 渗透测试实战
4.1 任意用户登录漏洞
测试步骤:
- 在忘记密码处输入手机号并点击发送验证码
- 在验证码输入框输入任意6位数字
- 拦截服务器返回数据包
- 解密返回数据包(示例解密结果)
- 修改返回数据包为
{"code":200}并加密后发送 - 成功跳转至设置密码页面
- 设置新密码后即可登录任意用户
漏洞原理:服务端未验证验证码的正确性,仅依赖客户端返回的状态码判断验证是否通过。
4.2 SQL注入漏洞
测试步骤:
- 在搜索功能处抓取数据包
- 解密返回数据查看数据结构
- 修改POST参数
itemName为单引号',观察服务器返回500错误 - 推测SQL语句为模糊查询:
'select * from table where clo like '+canshu+'%' - 构造payload猜测数据库用户名长度:
{"pageNum":1,"pageSize":10,"itemName":"%' and concat((case when length(user)>=3 then '1' else '0' end),'%')='1","bondName":""} - 通过返回结果判断用户名长度(示例中长度为3)
- 构造payload猜测用户名:
{"pageNum":1,"pageSize":10,"itemName":"%' and concat((case when ascii(substr(user,3,1))>=67 then '1' else '0' end),'%')='1","bondName":""}
漏洞原理:服务端未对用户输入进行过滤,直接将用户输入拼接到SQL语句中。
5. 工具与技巧
5.1 常用工具
- adb工具:用于访问安卓设备文件系统
- CrackMinApp:wxapkg反编译工具
- Burp Suite:拦截和修改网络请求
- 加密解密工具:根据发现的算法实现加解密
5.2 实用技巧
- 全局搜索关键词快速定位关键函数
- 关注常见的加密算法和模式
- 修改返回包测试服务端验证逻辑
- 通过错误信息推测后端实现
6. 防御建议
- 服务端验证:所有关键操作应在服务端进行完整验证
- 参数化查询:使用预编译语句防止SQL注入
- 增强加密:避免使用ECB等不安全加密模式
- 输入过滤:对所有用户输入进行严格过滤和验证
- 错误处理:避免将详细的错误信息返回给客户端
7. 总结
小程序安全测试需要结合传统Web测试方法和小程序特有的技术特点。通过提取和分析前端源码,可以快速定位加解密方法,进而对加密数据包进行测试。本指南介绍的两个高危漏洞案例展示了常见的安全问题,测试人员应重点关注类似的逻辑漏洞和注入漏洞。