0x00 前言

原文章:https://forum.butian.net/share/1227

这篇文章在上面的文章的基础上做了一些补充,新增了一种更加方便快捷的反编译微信小程序方法和快速查找信息泄露和未授权接口的方法。

算是二创了吧,如果大家有更好的想法也可以提出来,尽善尽美。

请享受你的微信小程序渗透之旅。


2022/10/03补充:

微信小程序信息在线收集,wxapkg源码包内提取信息:

https://github.com/moyuwa/wechat_appinfo_wxapkg

一篇非常优秀的微信小程序渗透文章:

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

0x01 环境准备

个人更加推荐使用模拟器作为抓包方式,而其中使用低版本的模拟器和低版本的微信绝对会让你的抓包之旅更加愉悦。

使用的是6.6.1.1 版本的夜神模拟器,内设系统为 android 5.0 ,比较容易抓取 https 包。

使用 ipconfig 查看 模拟器的 ip 地址。

在连接 wifi 的情况下,网卡为 VirtualBox Host-Only Network #xx

image-20220331222726922

在使用网卡连接的情况下,

image-20220331222908698

burpsuite 上设置代理:

image-20220331223259954

然后夜神模拟器设置代理,点击左上角——>添加网络,然后填入 WiredSSID,点击高级选项,设置的代理 ipportburpsuite 对应即可

image-20220331224148680 image-20220331224344902

,直接打开浏览器访问 192.168.56.1:8889 ,下载证书

image-20220331224640319

打开文件管理器,在sdcard->Download目录中可以看到下载下来的证书

image-20220331224822198

cacert.der更名为cacert.cer,也就是将后缀改成cer

更改文件名可以按 crtl + 4 打开文件管理器,点击打开电脑文件夹,进入 download ,在电脑上进行更改

image-20220331225206798

然后到手机设置->安全中,选择从 SD 卡安装。

image-20220331225339540 image-20220331225417431

安装证书

image-20220331225459155

测试一下,浏览器访问百度,burpsuite 能正常抓包说明已经设置环境成功

然后可以下载 微信 8.0 版本。

有些小程序无法通过下拉面板进入,提示微信版本过低,这时可以通过搜索小程序的名字进入。

0x02 反编译微信小程序代码

1. 批量PC端反编译(个人补充)

项目地址:https://github.com/DC3x6/Unpack

好评

2. 手工反编译

我们在模拟器里登录微信,然后随便选择一个微信小程序打开

图片

打开文件管理器,在data/data/com.tencent.mm/MicroMsg会生成一个md5加密命名的文件夹(如果打开微信小程序过多,同时有多个文件夹不容易识别的情况,可以选择把MicroMsg文件夹所有内容删除掉,再去重新打开微信小程序,就会得到唯一一个MD5加密命名的文件夹啦)

有的微信小程序包在其他位置:data/data/com.tencent.mm/MicroMsg/appbrand/pkg/general

图片

在该文件夹下的appbrand/pkg目录下找到.wxapkg后缀结尾的文件,其中只有几MB大小的为刚刚打开的小程序的文件

图片

点击勾选之后,来到根目录下的mnt/shared/App目录,打开右上角三个.的功能菜单选择粘贴选择项,将文件复制到该文件夹

图片

这里的文件夹就是电脑共享的文件夹,点击打开电脑文件夹

图片

可以找到小程序的文件

图片

这里推荐有 GUI 界面的反编译工具:https://github.com/ezshine/wxapkg-convertor/releases

直接将文件鼠标拖拽到 GUI 界面即可开始反编译,在拖入文件的当前目录得到反编译生成的文件夹

图片
图片

然后就可以开始舒服的看看 js 代码啦

图片

0x03 反编译源码代码审计

举例某小程序审计,在登录界面爆破无关之后,直接反编译拖源码审计一下,反编译出来的源码,我们着重看 js 文件及其配置文件即可。第一想法就是先找一些接口,尝试是否有未授权之类的漏洞,下面就是找到的一处路由user/getUserInfoByUsername

图片

可以看到发送数据类型为 json 格式,并且参数为usernameschool,于是尝试构造请求发送

图片

成功获取系统管理员详细信息,其中包括关键的密码。获取到 md5 加密形式的密码密文后,本来还想去 cmd5 去解一下, 但是接下来注意到一个登录路由user/loginByUsernameAndPassword

图片

从源码中都看得出来就是通过账号密码去登录,刚刚未授权得到的密码存储为 md5 加密形式,想来登录应该也是进行 md5 加密的形式,所以直接发送加密形式的密码即可,构造请求发送

图片

验证登录成功。这类常常出现未授权漏洞的路由命名方式大抵都是

1
2
3
4
xxxByXXXId
xxxByUsername
xxxbyphone
......

审计的时候我们可以做一个规则去全局搜索源码匹配这类命名方式的路由

0x04其他类型漏洞案例


自动化查找信息泄露和未授权接口 (个人补充)

对于下方的手工寻找信息泄露漏洞和未授权漏洞,代码审计需要手工,我有更加自动化快捷的查找方法

  1. 利用 Packer-Fuzzer 查找

项目地址:https://github.com/rtcatc/Packer-Fuzzer

这种方式首先目标站点是 webpack 打包的站点,识别是否是 webpack 技术打包的也很简单,查看源代码,比如这样:

image-20220419154109255 image-20220419154158844

这种点击源代码,几乎没有 html 代码的就是了

优点是:结果报告友好、简洁。

  1. 利用 JSFinder 查找

项目地址:https://github.com/Threezh1/JSFinder

这种方法直接使用 -u 命令指定 url 来搜索 js 中的链接即可。微信小程序都有一个对用的 url,url 在 burpsuite 抓包中获得,直接复制到浏览器上打开,如果能正常打开即可。

优点是:不需要是 webpack 打包的站点。

  1. 微信小程序信息在线收集,wxapkg源码包内提取信息

https://github.com/moyuwa/wechat_appinfo_wxapkg


下面举例其他类型的漏洞审计案例,这里目的是为了说明小程序有哪些漏洞可以挖

信息泄露

反编译出来的源码泄露登录账号密码,这里是因为在 js 文件中写死了账号密码,只做了前端验证导致的漏洞,从下面贴的两个小程序源码中可以看到

图片

图片

在时间稍稍往前的小程序中,还经常会有泄露小程序secret的情况,简直就是把打开保险箱的密码放在你面前

未授权接口

仔细翻找 js 文件能找到不少未鉴权的 api 接口(可以着重注意配置文件,不少配置文件都会写上路由列表),例如该 api 返回大量用户敏感信息

图片

测试未授权时,有一些小技巧:例如当在 GET 或者 POST 传参中有token等鉴权参数,例如

1
GET /api/GetUserInfo?id=xxx&token=xxxx HTTP/1.1

可以尝试将token参数的值置空或者删除token参数,往往能 bypass 鉴权,我已经遇见好多次这种情况了。举例一个案例:
该微信小程序可以注册用户,注册账号登录之后抓包,我的账号数据包如下

1
GET /wx/queryOrders?orderState=&serviceUid=&repairUid=6864&pageNum=1&pageSize=20&uid=6864&token=9938C366-XXXX-XXXX-XXXX-9C7709D8C9E8

当我尝试将uid参数改成其他用户时,返回权限不足,尝试将token删除

1
GET /wx/queryOrders?orderState=&serviceUid=&pageNum=1&pageSize=200&uid=2000

图片

除此之外,测试一些参数,比如手机号,不知道该系统用户手机号时,可以试试像上面说的将其置空,往往运气好能碰上系统后端查询使用的模糊查询为空时返回所有信息,下面贴图的案例就是将手机号参数置空后,成功获取到账号详细信息

图片

越权漏洞

下面案例举例一个通过 Cookie 中的参数进行鉴权的漏洞,可以通过修改NetId中的值来遍历获取用户信息。此类漏洞的挖掘在鉴权处的源码,审计时可以着重审计其验证流程

图片

当时也是依靠这个漏洞获取到 VPN 账号密码,得以进入内网渗透

逻辑漏洞

使用 burpsuite 抓取管理员登录数据包,获取返回包

图片

该处在login.js文件登录判断条件中,源码判断返回为 0 时登录成功,所以我们将返回包从 1 改成 0 即可登录成功。

图片

还有 任意密码重置 ,该处漏洞倒也是在黑盒中无意发现,在修改密码处需要验证对应账号接收到的短信验证码。但怀着尝试的心态通过 buspsuite 抓包绕过 js 限制,随意填写验证码便可以重置任意用户密码,不细心就会很容易忽视的点

图片

appid和secret的利用

当时测试数据的时候,发现添加字符%%会导致其后端报错,返回appidsecret

图片

获取到的appid和secret可以到微信的官方接口去自由生成微信小程序的命脉AccessToken

图片

拿到 AccessToken,相当于可以控制整个小程序了,并且 AccessToken 微信每天只能生成20次,不断请求满20次的话可以使小程序崩溃无法使用。

图片

其次利用AccessToken可以执行相当多的其他操作,见微信官方文档,这里就不画蛇添足了。

工具自取链接:

1
2
链接:https://pan.baidu.com/s/1vMVvmm2n2wyr3vhzp91iqA 
提取码:jpho

因为百度网盘下载速度感人,我在这里补充一个个人的阿里云盘链接分享,然后在夜神模拟器里面自行下载 微信8.0 即可

链接:https://www.aliyundrive.com/s/SvTBaQwJK3S

0x05 总结

初步学会了微信小程序的渗透。技能+1。