最近测试小程序比较多,这里总结一下测试方法,先从小程序本地文件包开始;

获取文件包

入手目标:手机端、PC 端

现在 PC 也能运行小程序了,按理说也跟手机端类似会有在本地的运行包,但是测试下来 MAC 的最新版 2.5.0(现在 2.6.0,依然没找到),没有找到类似 wxapkg 的文件;

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图1

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图2

在 Windows PC 端上,微信小程序 wxapkg 目录在 C:\Users\xxx\Documents\WeChat Files\Applet\wxbxxxxxxxxxxxxxxd0\xx

然后 Windows 和 Android 的加密也不一样,应该说 Android 没有加密,只是编译打包好了,通过特定字节序拆分即可还原;而 Windows 平台需要解密后才可以还原;

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图3

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图4

以 Android 手机微信 APP 为例;

小程序存在目录为:/data/data/com.tencent.mm/MicroMsg/{UserId}/appbrand/pkg/

顺带 IOS 的目录为:/var/mobile/Containers/Data/Application/{程序 UUID}/Library/WechatPrivate/{用户 ID}/WeApp/LocalCache/release/{小程序 ID}/

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图5

经测试发现,现在的小程序一般都比较大,通常不止一个 wxapkg 包,会出现分包的情况,一些老的小程序大部分就单个 wxapkg 包。

文件包格式解析

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图6

头部字节前后的块是固定的,可以此来还原;因为移动的还原工具有很多,大佬们的分析也很透彻,这里就不写了;

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图7

文件包还原

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图8

导入还原后的数据时会要求包含 app.json/project.config.json 的目录;测试发现单文件的小程序肯定是有的,但是多文件会在其中一个找到,然后多文件一般需要几个文件都导进去才可以跑起来,不然一片通红。

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图9

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图10

常规的本地硬编码

如获取开发者的 appid 和 secret 等

微信接口测试:

微信公众平台接口调试工具:http://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index

开发指南:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html

获取 appid 和 secret,便可以获取公众号管理权限;

获取 access token:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET

获取服务器地址:https://api.weixin.qq.com/cgi-bin/get_api_domain_ip?access_token=ACCESS_TOKEN

查询接口 - 不一定有开通,开通了的话可以查看所有已经开通的接口服务;https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=ACCESS_TOKEN

其他接口要看开通情况来调用。

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图11

这里可以简单写个脚本,通过传入 appid 和 secret 参数来获取 token,然后测试其他开通的接口。

加解密破解、证书验证绕过

现在很多小程序都存在数据加密或者验签操作(现在默认单向证书认证,也就是 SSL pinning,可通过 justTrustMe 绕过,这里说的是双向认证),当需要绕过证书验证,或者解密数据内容时,本地还原的文件可以帮到我们;

接口未授权测试

获取更多的 api 进行测试,无需遍历各种 api 字典了;

特殊场景

内部服务未授权访问

测试接口

更多测试场景和思路等待挖掘

微服务信息收集小技巧:

很多子域名打开为空白页面,或者找不到访问路径的,特别是 app.xxx.comwx.xxx.com一类,一般为微信公众号的服务,或者小程序的服务,可以到微信搜索一下关键字;

微信小程序还有一个特别的地方可以看到相关域名;

如图,打开对应小程序,按红圈标记的顺序点开,在更多资料处可以看到相关的域名,以及该微信小程序的 appid;

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图12

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图13

关于小程序抓包,目前微信小程序做了证书验证,常规 APP 抓包不可用,可以通过 JustTrustMe+xposed 的方式来抓;但是有时候觉得微信登来登去太麻烦,或者没有 root 环境,可以将测试的小程序转发到文件传输助手在 PC 端打开,然后开启全局代理抓包即可;

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图14

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图15

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图16

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图17

微信小程序测试思路 - FreeBuf网络安全行业门户 - 图18

抓取了接口,获得所需参数,简单写个脚本,这样就可以加入信息收集的工具里面了。

本文作者:杉木 @涂鸦智能安全实验室

漏洞悬赏计划:涂鸦智能安全响应中心(https://src.tuya.com)欢迎白帽子来探索。

招聘内推计划:涵盖安全开发、安全测试、代码审计、安全合规等所有方面的岗位,简历投递sec@tuya.com,请注明来源。

参考:https://www.hackinn.com/index.php/archives/672/

小程序文件结构:https://lrdcq.com/me/read.php/66.htm

解包工具:https://github.com/leo9960/wechat-app-unpack

Windows PC 微信小程序分析:https://blog.csdn.net/yeyiqun/article/details/109172556

PC 解包:https://github.com/kksanyu/pc_wxapkg_decrypt_python
https://www.freebuf.com/articles/web/259705.html