记某次金融小程序数据加密及签名逆向
字数 1492 2025-08-22 12:22:42
金融小程序数据加密及签名逆向分析教学文档
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:微信接口获取的wechatcoden:硬编码的公钥和私钥
-
生成步骤:
- 调用
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实现示例
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 总结
- 该小程序使用AES+RSA双重加密机制
- 关键点在于定位加密函数和获取硬编码的公私钥
- 通过调试工具可以逐步分析加密流程
- 使用原生算法实现相对容易逆向
- 固定IV和Key可以简化测试过程
注意事项
- 渗透测试需获得授权
- 实际实现可能因小程序版本不同而有所变化
- 调试过程需要耐心和细心
- 建议使用测试账号进行操作