小程序反编译的安全测试案例解析

自2019年开始,中央网信办、工业和信息化部、公安部和国家市场监管总局在全国范围内组织开展app违法违规收集使用个人信息专项治理工作,加大个人信息保护力度。《个人信息保护法》增加了对于app个人信息保护的专门性规定。而如今小程序等新应用形态不断出现,相比app而言,无论开发还是使用门槛更为简便,小程序的安全继承了微信app整体的安全建设,因此无需像传统的app测试对客户端本身进行测试,测试的重点在于服务端,即小程序与后端进行交互过程中存在的安全风险。
小程序解包
以往反编译小程序源码都是要从移动端获取,相较于电脑端来说比较麻烦。因本机为mac电脑,以下方法适用于mac端wxapkg解密。使用的工具为mac_wxapkg_decrypt 该工具提供了2种解密的方法, 一种是提取解密用的key, 一种是直接让小程序自动解密。这里我使用了第二种方法,通过更改_agent.js里小程序的路径,然后hook,自动产生解密后的文件。首先找到mac小程序地址。
/users/xxxx/library/group containers/xxxx.com.tencent.xinwechat/library/caches/xinwechat/xxxxxxxxxx/weapp/localcache/release/ 
当我们mac端微信访问小程序后,会按照appid生成对应的目录,根据appid寻找要解包的小程序
然后修改_agent.js文件中小程序的路径以及解密后的文件路径。
搜索本机小程序的进程
ps -ef |grep mini
利用frida加载_agent.js脚本进行hook,生成解密后的wxapkg
小程序反编译
获取了解密后的小程序包,那么下面就开始进行反编译获取源代码。通过github搜索相关小程序反编译工具,发现几乎都已被删除,要么开始收费。最后找到了一款基于wxappunpacker改进的开源项目,测试发现还可以使用。下载地址:https://gitee.com/ksd/wxappunpacker 使用方法也很简单,首先安装依赖
npm install esprimanpm install css-treenpm install cssbeautify npm install vm2npm install uglify-esnpm install js-beautify 当检测到wxapkg为子包时, 添加-s参数指定主包源码路径即可自动将子包的wxss,wxml,js解析到主包的对应位置下,完整流程大致如下:
获取主包和若干子包解包主包 ./bingo.sh testpkg/master-xxx.wxapkg解包子包 ./bingo.sh testpkg/sub-1-xxx.wxapkg -s=../master-xxx 运行后即可成功反编译小程序。
然后我们就可以利用开发者工具进行还原小程序。文件夹中的 html、wxss 等文件主要是存放了页面结构、小程序页面样式等内容,对于安全测试来说重点分析文件中js,如果小程序在与后端服务器进行了加密传输,可以根据传输中的加密参数值进行跟踪,逐步分析参数是进行如何加密的。
小程序抓包安全测试
对于pc端来说,小程序的抓包是比较简单的,直接设置系统代理,然后打开burp也设置代理就能抓到https。设置代理抓包后,运行小程序并抓取登录数据包,发现账号密码以及返回信息均被国密sm2加密传输。所以我们可以通过提取小程序的源码信息,获得小程序在传输过程中进行的数据的加密方式,分析来得出整个加密算法。
通过注册登录后查看个人信息,发现url参数为明显的数字编号,通过遍历编号发现返回包内容信息发生了变化,猜测该小程序存在越权漏洞,可通过该漏洞获取个人敏感信息。
获取小程序国密sm2密钥
通过反编译获取到的sm2的私钥可对密文进行解密,也可以将泄露的公钥进行加密用户名和密码字典,进行爆破账户。
公钥:04b9c9a6e04e9c91f7ba880429273747d7ef5ddeb0bb2ff6317eb00bef331a83081a6994b8993f3f5d6eadddb81872266c87c018fb4162f5a24620207 私钥:00b9ab0b828ff68872f21a837fc303668428dea11dcd1b24429d0c99e3d5
最终可通过编写脚本,利用该漏洞可批量解密获取明文的个人敏感信息。
import sysfrom gmssl import sm2from base64 import b64encode, b64decode# sm2的公私钥sm2_private_key = ''sm2_public_key = ''sm2_crypt = sm2.cryptsm2(public_key=sm2_public_key, private_key=sm2_private_key)# 加密def encrypt(info):    encode_info = sm2_crypt.encrypt(info.encode(encoding=utf-8))    encode_info = b64encode(encode_info).decode()  # 将二进制bytes通过base64编码    return encode_info# 解密def decrypt(info):    decode_info = b64decode(info.encode())  # 通过base64解码成二进制bytes    decode_info = sm2_crypt.decrypt(decode_info).decode(encoding=utf-8)    return decode_infoif __name__ == __main__:    action = sys.argv[1]  # 取命令中的加解密动作    contact_info = sys.argv[2]  # 取命令中需要加解密的内容    if action == encrypt:        encrypted_contact_info = encrypt(contact_info)        print(encrypted_contact_info)    if action == decrypt:        decrypted_contact_info = decrypt(contact_info)        print(decrypted_contact_info) 总结
通过加密参数为关键字进行源代码全局搜索,从而获取到该小程序的加密方式,可以尝试进行越权访问、sql注入、账号密码的爆破等漏洞的安全测试,也有一些小程序使用云存储,可能会将一些oss的secret key硬编码放在小程序源代码文件中。


手机视频监控功能介绍以及应用范围
近10家厂商向美国申请继续供货华为
深度剖析中国半导体材料行业投资前景
客厅娱乐影音设备层出不穷 智能电视客厅地位遭挑战
简单恒流充电电路图大全(八款简单恒流充电电路设计原理图详解)
小程序反编译的安全测试案例解析
SONY完全无线立体声耳机的特征
统计学知识大梳理
游标卡尺的使用方法及注意事项
PRED3-350/10V-D24K1电气比例控制压力阀控制器
中兴通讯召开2021年度股东大会及业绩说明会
模型调参:CANape与Simulink的强强联手
三极管的判别
TDK 收购 Qeexo,以实现完整智能边缘平台
研究人员用水和6-14%的纤维素颗粒和纤维制成了一种打印墨水
达实推出设备场景专用控制器让运维管理变得更加轻松便捷
动态随机存储器集成工艺(DRAM)详解
云计算技术对人类生活有何影响?
基于Microchip PIC32MM开发板的电机控制
接地电阻柜是如何命名的?