微信小程序反编译浅析及实战(二)
字数 1237 2025-08-12 11:34:09
微信小程序反编译与水平越权漏洞挖掘实战教程
一、前言
本教程基于FreeBuf文章《微信小程序反编译浅析及实战(二)》,详细讲解如何通过反编译微信小程序源码,发现并利用水平越权漏洞。教程包含反编译步骤、敏感数据提取、加密算法分析以及漏洞验证全过程。
二、准备工作
- 反编译工具:需要准备微信小程序反编译工具(如wxappUnpacker)
- 抓包工具:Burp Suite或Charles用于抓取小程序网络请求
- 开发环境:Node.js环境用于运行反编译脚本
- 文本编辑器:VS Code或其他代码编辑器用于分析源码
三、小程序反编译步骤
-
获取小程序包:
- 在手机微信中运行目标小程序
- 从手机存储中提取
.wxapkg包文件(路径通常为/data/data/com.tencent.mm/MicroMsg/{user_hash}/appbrand/pkg/)
-
使用反编译工具解包:
node wuWxapkg.js <path_to_pkg> -
分析解包后的文件结构:
app-service.js(或类似名称):包含主要业务逻辑- 各种
.wxml、.wxss文件:界面布局和样式 - 配置文件:
app.json等
四、寻找敏感数据
-
在反编译后的代码中搜索以下关键词:
key、iv:AES加密的密钥和初始向量encrypt、decrypt:加密解密函数secret、password:可能的敏感信息
-
示例发现(如文中所述):
- 开发人员直接赋值了AES的key和iv值
- 虽然后来做了隐藏处理,但只是将值移动到其他位置调用,本质上未改变
五、加密算法分析
-
识别加密方式:
- 文中案例使用的是AES加密
- 加密函数名可能被混淆(如
encryptzmt) - 解密函数对应为
decrytzmt
-
提取关键参数:
// 示例中的AES参数 const key = "提取到的key值"; const iv = "提取到的iv值";
六、构建本地加解密环境
-
创建测试JS文件:
// crypto.js const CryptoJS = require("crypto-js"); function decryptData(encryptedData) { // 使用提取的key和iv实现解密逻辑 // ... } function encryptData(rawData) { // 使用提取的key和iv实现加密逻辑 // ... } -
创建HTML测试页面:
<!DOCTYPE html> <html> <head> <script src="crypto.js"></script> </head> <body> <script> // 在此调用解密函数测试 </script> </body> </html>
七、漏洞验证步骤
-
抓取小程序请求:
- 使用Burp Suite拦截小程序API请求
- 获取加密的请求和响应数据
-
解密请求数据:
- 在浏览器控制台调用解密函数
- 验证是否能成功解密请求参数
-
识别敏感参数:
- 如文中发现的
customerId参数 - 确认该参数是否用于身份鉴别
- 如文中发现的
-
构造越权请求:
- 遍历可能的
customerId值 - 使用加密函数重新加密修改后的参数
- 通过Burp Suite重放请求
- 遍历可能的
-
解密响应数据:
- 获取加密的响应后,使用解密函数查看内容
- 验证是否能获取其他用户敏感信息
八、漏洞修复建议
- 服务端应对所有请求进行身份验证
- 不要在前端存储加密密钥等敏感信息
- 使用临时令牌而非固定参数作为身份标识
- 对敏感操作增加二次验证
- 实施完善的权限控制系统
九、总结
通过本教程,我们学习了:
- 微信小程序反编译的基本方法
- 如何从混淆代码中提取加密算法和敏感数据
- 构建本地环境验证加密逻辑
- 水平越权漏洞的发现和利用过程
- 完整的漏洞验证方法论
注意:本教程仅用于安全研究和学习目的,未经授权对他人小程序进行反编译可能违反相关法律法规和服务条款。