反编译小程序、数据加密解密、sign值绕过
sys0ne 渗透测试 700浏览 · 2025-04-23 01:19

在一次渗透测试中对客户的小程序进行测试,一抓包就发现重重加密数据,在手机号一键登录数据包中发现泄露了session_key值,但是进行加密处理过,那就反编译小程序进行解密尝试。

反编译小程序

在点击该小程序时,C:\Users\xxx\Documents\WeChat Files\Applet在该目录下下会生成一个新的目录,最好时只留下面两个目录。

image.png


image.png


在生成的目录下找到__APP__.wxapkg文件,使用UnpackMiniApp.exe进行解密,重新生成一个wxapkg文件,

image.png


将生成的wxapkg文件拖到wxapkgconvertor.exe进行反编译,就会在wxapkg文件目录下生成一个新的文件夹,使用微信开发者工具打开就可以看到小程序的源码了

image.png


image.png




解密AES函数

发现存在数据加密,编译小程序,分析源码

image.png


对小程序进行调试,直接全局搜AES字段,发现 AES 的加密密钥硬编码在源代码中。

decryptByAes 是一个用于解密的函数,它使用 AES算法解密输入的密文,返回明文。解密过程需要密文、密钥和初始化向量(IV),并使用 CBC 模式和 PKCS7 填充。

image.png


根据默认密钥编辑 python 脚本(通用脚本,直接替换key或iv即可)



image.png


通过脚本解密出encryptedData、sessionKey、iv 值。

image.png


获得原始数据。

image.png




绕过sign值校验

修改手机号,改为任意用户的手机号,在进行加密处理,但是存在 sign 值校验,可以看到sign值时md5加密,不可逆,但是我们可以了解sign值的加密流程,修改数据重新加密sign值,然后替换sign值,进行绕过。



全局搜索sign,分析源码中的 setsigntrue 函数,

image.png


这个函数接受四个参数:t,n,r,a。根据代码,t是主要的参数,n是可选参数,默认是空对象,r和a也有默认值。函数内部首先将n的属性合并到t中,也就是说,n中的键值对会被添加到t对象里。然后,它调用this.objKeySort(s),这里的s是处理后的t对象。objKeySort的作用是对对象的键进行排序,返回一个排序后的新对象。接下来,函数遍历排序后的对象s,将每个键值对以“key=value”的形式拼接成字符串i。然后,i后面拼接上r和a,最后对这个拼接后的字符串进行MD5加密,并转换为大写字符串返回。

1将传入的n参数合并到t对象中,也就是把额外的参数添加到t里。

2对t对象的所有键进行排序,得到排序后的对象s。

3遍历排序后的s,将每个键值对拼接成“key=value”的字符串,并将这些字符串按顺序连接起来,形成字符串i。

4在i的末尾添加r和a的值,得到最终的拼接字符串。

5对这个最终字符串进行MD5哈希,并将结果转为大写,作为sign值返回。



运行 python 文件,输出的 md5 值和原始数据中的 sign 值一致

image.png


image.png


现在流程全部走完了

复现流程

抓取登录数据包,将密文都进行解密处理后,输入任意手机号,加密处理,将加密后的内容放入加密sign脚本文件中生成一个新的sign值,替换sign。就可以实现任意手机号登录。

image.png


image.png


image.png


image.png




7 条评论
某人
表情
可输入 255