首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Burpy插件实战-某微信小程序加密算法破解

Burpy插件实战-某微信小程序加密算法破解

作者头像
Gcow安全团队
发布2025-12-31 10:18:28
发布2025-12-31 10:18:28
1530
举报
文章被收录于专栏:Gcow安全团队Gcow安全团队

Author:0pening

1、前言


对某微信小程序进行测试,不说多的,马上开动BurpSuite抓包。然而抓到包就发现不对劲🤨了。

这货将传递的参数加密为bizContent,还有签名参数sign用来防止中间人篡改数据包…..不讲武德。

2、分析数据包


先硬着头皮分析一下吧,看看签名参数sign是不是校验了。通过删减参数进行判断,这原来是个纸老虎。参数删简如下,数据包可以正常发送。

原来sign只是个纸老虎,后端就没有校验。那是否通过openId来进行用户身份的校验的🤔️?

通过修改openId参数,发现存在逻辑问题。

错误的openId,校验失败。

openId为空,成功返回数据。

删除openId参数,成功返回数据。

由于这是个请求个人信息的接口,删除或使openId为空,都拿到了个人信息。那么bizContent参数中存在某个参数决定了用户身份标识,如果这个标识可预测,极有可能通过修改这个标识越权获取到他人身份信息。

3、签名算法破解


通过上面一通分析,接下来就要想办法获取到bizContent参数的明文数据。

通过查看BurpSuite的数据包history记录

查找上下文都没有找到相关JS请求,那么加密算法的源码应该在微信小程序源码里了。

  • 微信小程序源文件在开发者发布后存储在微信的服务器上,当用户首次加载小程序时会下载小程序到用户本地(*****.wxapkg格式的二进制文件)。

提取.wxapkg文件:(安卓会放到如下目录)

代码语言:javascript
复制
/data/data/com.tencent.mm/MicroMsg/{数字串}/appbrand/pkg/

反编译.wxapkg文件获取小程序源码(https://github.com/Cherrison/CrackMinApp)

使用这款工具主要是不需要额外安装node.js环境,可以直接干。

通过全局搜索关键字bizContent,发现在定位app-service.js中。将app-service.js进行JS美化下便与阅读。找到了加解密算法。

测试下AES解密,解密成功,传递的两个参数,一个idcard身份证,一个desc请求接口。

之后通过替换idcard身份证参数为他人身份证,调用接口查询,返回了他人信息,实锤越权了。

4、Burpy插件使用


搞定加密算法后就可以测试了,但产生个问题,我难道要每次把bizContent参数和返回数据每次复制粘贴出来解密来测吗?又没有什么更优雅的测试方式呢?

把视角瞄向了m0nst3r的https://github.com/mr-m0nst3r/Burpy 。已支持python3

使用教程博客里有:

代码语言:javascript
复制
https://m0nst3r.me/burpsuite/打通BurpSuite与Python之间的任督二脉.html

加载插件后配置如下:(插件需要安装Pyro4 -> pip3 install Pyro4)

收集到AES相关加密配置如下:

代码语言:javascript
复制
783a2274472d5928 
iv = 0102030405060708 
Mode = ECB 
padding = Pkcs7

编写AES加解密脚本。只要按照项目要求实现encrypt、decrypt两个函数。

代码语言:javascript
复制
import json 
import base64 
from Crypto.Cipher import AES 




class Burpy: 
    def __init__(self): 
        self.key = "783a2274472d5928" 
        self.iv = "0102030405060708" 
        self.apicode = "" 

    def encrypt(self, header, body): 
        # 获取加密参数bizContent 
        body_json = json.loads(body) 
        bizContent = json.dumps(body_json["bizContent"]).replace(' ', '') 

        #AES加密 
        while len(bizContent) % 16 != 0:  # 补足字符串长度为16的倍数 
            bizContent += (16 - len(bizContent) % 16) * chr(16 - len(bizContent) % 16) 
        bizContent = str.encode(bizContent) 
        aes = AES.new(self.key, AES.MODE_ECB)  # 初始化加密器 
        bizContent  = str(base64.encodebytes(aes.encrypt(bizContent)), encoding='utf8').replace('\n', '') 

        #替换参数,openId置空绕过 
        body_json["bizContent"] = bizContent 
        body_json["openId"] = '' 

        body = json.dumps(body_json) 
        return header, body 

    def decrypt(self, header, body): 
        cipher = AES.new(self.key, AES.MODE_ECB, self.iv) 
        # 获取加密参数bizContent 
        body_json = json.loads(body) 
        bizContent = body_json.get("bizContent") 

        #AES解密 
        content = cipher.decrypt(base64.decodebytes(bytes(bizContent, encoding='utf8'))).decode("utf8") 
        content = content[:-ord(content[-1])] 
        body_json["bizContent"] = json.loads(content) 

        body = json.dumps(body_json) 
        return header, body

加载插件后配置如下,勾选自动加解密。

测试如下,完美获取数据,测试优雅多了!

在Repeater中修改数据包直接明文发送,返回包自动解密。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Gcow安全团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、前言
  • 2、分析数据包
  • 3、签名算法破解
  • 4、Burpy插件使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档