记某次金融小程序数据加密及签名逆向
字数 1492 2025-08-22 12:22:42

金融小程序数据加密及签名逆向分析教学文档

0X01 前言

本文档详细记录了对某金融小程序进行渗透测试时,对其数据包加密及签名机制的逆向分析过程。通过本教程,您将学习到如何逆向分析小程序加密逻辑、定位关键加密函数以及重现加密过程。

0X02 准备工作

所需工具

  1. 微信开发者工具调试版:用于调试小程序

    • 获取方式:https://github.com/JaveleyQAQ/WeChatOpenDevTools-Python
    • 支持版本:微信3.9.10.19(最新版可能不支持)
  2. 微信版本降级工具

    • 下载地址:https://github.com/tom-snow/wechat-windows-versions/releases
  3. 小程序反编译工具:用于获取小程序源码

环境配置

  1. 检查微信小程序版本:

    • 路径:C:\Users\admin\AppData\Roaming\Tencent\WeChat\XPlugin\Plugins\RadiumWMPF
  2. 若开启devtools失败:

    • 删除相关文件后重新启动微信

0X03 加密机制分析

加密流程概述

该小程序使用双层加密机制:

  1. 使用AES-CBC加密请求数据
  2. 使用RSA加密AES的密钥和IV
  3. 使用私钥对请求进行签名

关键参数解析

  1. securityParam:请求体加密后的数据
  2. Salt:AES-CBC的IV,经RSA加密
  3. Encryptkey:AES-CBC的密钥,经RSA加密
  4. Timestamp:时间戳
  5. Sign:防重放签名

0X04 加密细节分析

1. securityParam生成过程

  • 方法:y(t, e, n)

    • t:未加密的原始数据
    • e:微信接口获取的wechatcode
    • n:硬编码的公钥和私钥
  • 生成步骤:

    1. 调用p()方法生成随机字符串ri
    2. r赋值给salt(IV),i赋值给encryptkey(AES密钥)
    3. 调用u()方法进行AES-CBC加密
      • 加密模式:AES-CBC
      • 密钥:encryptkey
      • IV:salt

2. Salt和Encryptkey加密

  • 加密方式:RSA加密
  • 使用公钥:硬编码在前端
  • 加密方法:h()
    • 调用jsrsasign库的KJUR.crypto.Cipher.encrypt(t, r)

3. Sign签名生成

  • 签名方法:y()
  • 参数:
    • securityParam加密后的值
    • 加密后的值
  • 使用私钥进行签名
  • 调用库:jsrsasign

0X05 加密流程总结

  1. 前端随机生成AES的IV(salt)和密钥(encryptkey)
  2. 使用AES-CBC加密原始请求数据,生成securityParam
  3. 使用RSA公钥加密saltencryptkey
  4. 使用私钥对securityParam和加密后的值进行签名,生成sign
  5. 将所有参数放入请求头发送

0X06 逆向实现方案

Python实现示例

from Crypto.Cipher import AES
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64
import time

# AES加密
def aes_encrypt(data, key, iv):
    cipher = AES.new(key, AES.MODE_CBC, iv)
    pad = lambda s: s + (AES.block_size - len(s) % AES.block_size) * chr(AES.block_size - len(s) % AES.block_size)
    encrypted = cipher.encrypt(pad(data))
    return base64.b64encode(encrypted)

# RSA加密
def rsa_encrypt(data, public_key):
    key = RSA.importKey(public_key)
    cipher = PKCS1_v1_5.new(key)
    encrypted = cipher.encrypt(data.encode())
    return base64.b64encode(encrypted)

# 生成签名
def generate_sign(data, private_key):
    # 实际实现应根据具体签名算法
    pass

# 示例使用
public_key = """-----BEGIN PUBLIC KEY-----
...公钥内容...
-----END PUBLIC KEY-----"""

private_key = """-----BEGIN PRIVATE KEY-----
...私钥内容...
-----END PRIVATE KEY-----"""

# 生成随机IV和Key
import os
salt = os.urandom(16)  # AES IV
encryptkey = os.urandom(32)  # AES Key

# 原始数据
raw_data = '{"param1":"value1","param2":"value2"}'

# 1. AES加密请求体
security_param = aes_encrypt(raw_data, encryptkey, salt)

# 2. RSA加密salt和encryptkey
encrypted_salt = rsa_encrypt(salt, public_key)
encrypted_key = rsa_encrypt(encryptkey, public_key)

# 3. 生成签名
timestamp = int(time.time())
sign = generate_sign(f"{security_param}{timestamp}", private_key)

# 构造请求头
headers = {
    "Salt": encrypted_salt,
    "Encryptkey": encrypted_key,
    "Timestamp": str(timestamp),
    "Sign": sign,
    "SecurityParam": security_param
}

0X07 自动化测试方案

参考自动化测试方案:

  • 使用代理工具拦截请求
  • 自动替换请求头参数
  • 自动加解密请求包和返回包
  • 参考文章:https://xz.aliyun.com/t/15969

0X08 总结

  1. 该小程序使用AES+RSA双重加密机制
  2. 关键点在于定位加密函数和获取硬编码的公私钥
  3. 通过调试工具可以逐步分析加密流程
  4. 使用原生算法实现相对容易逆向
  5. 固定IV和Key可以简化测试过程

注意事项

  1. 渗透测试需获得授权
  2. 实际实现可能因小程序版本不同而有所变化
  3. 调试过程需要耐心和细心
  4. 建议使用测试账号进行操作
金融小程序数据加密及签名逆向分析教学文档 0X01 前言 本文档详细记录了对某金融小程序进行渗透测试时,对其数据包加密及签名机制的逆向分析过程。通过本教程,您将学习到如何逆向分析小程序加密逻辑、定位关键加密函数以及重现加密过程。 0X02 准备工作 所需工具 微信开发者工具调试版 :用于调试小程序 获取方式:https://github.com/JaveleyQAQ/WeChatOpenDevTools-Python 支持版本:微信3.9.10.19(最新版可能不支持) 微信版本降级工具 : 下载地址:https://github.com/tom-snow/wechat-windows-versions/releases 小程序反编译工具 :用于获取小程序源码 环境配置 检查微信小程序版本: 路径: C:\Users\admin\AppData\Roaming\Tencent\WeChat\XPlugin\Plugins\RadiumWMPF 若开启devtools失败: 删除相关文件后重新启动微信 0X03 加密机制分析 加密流程概述 该小程序使用双层加密机制: 使用AES-CBC加密请求数据 使用RSA加密AES的密钥和IV 使用私钥对请求进行签名 关键参数解析 securityParam :请求体加密后的数据 Salt :AES-CBC的IV,经RSA加密 Encryptkey :AES-CBC的密钥,经RSA加密 Timestamp :时间戳 Sign :防重放签名 0X04 加密细节分析 1. securityParam生成过程 方法: y(t, e, n) t :未加密的原始数据 e :微信接口获取的wechatcode n :硬编码的公钥和私钥 生成步骤: 调用 p() 方法生成随机字符串 r 和 i 将 r 赋值给 salt (IV), i 赋值给 encryptkey (AES密钥) 调用 u() 方法进行AES-CBC加密 加密模式:AES-CBC 密钥: encryptkey IV: salt 2. Salt和Encryptkey加密 加密方式:RSA加密 使用公钥:硬编码在前端 加密方法: h() 调用 jsrsasign 库的 KJUR.crypto.Cipher.encrypt(t, r) 3. Sign签名生成 签名方法: y() 参数: securityParam 加密后的值 加密后的值 使用私钥进行签名 调用库: jsrsasign 0X05 加密流程总结 前端随机生成AES的IV( salt )和密钥( encryptkey ) 使用AES-CBC加密原始请求数据,生成 securityParam 使用RSA公钥加密 salt 和 encryptkey 使用私钥对 securityParam 和加密后的值进行签名,生成 sign 将所有参数放入请求头发送 0X06 逆向实现方案 Python实现示例 0X07 自动化测试方案 参考自动化测试方案: 使用代理工具拦截请求 自动替换请求头参数 自动加解密请求包和返回包 参考文章:https://xz.aliyun.com/t/15969 0X08 总结 该小程序使用AES+RSA双重加密机制 关键点在于定位加密函数和获取硬编码的公私钥 通过调试工具可以逐步分析加密流程 使用原生算法实现相对容易逆向 固定IV和Key可以简化测试过程 注意事项 渗透测试需获得授权 实际实现可能因小程序版本不同而有所变化 调试过程需要耐心和细心 建议使用测试账号进行操作