问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
浅谈微信小程序渗透
渗透测试
微信小程序渗透的经验分享
0x0前言 ===== 最近好多小伙伴都在问怎么对微信小程序进行渗透,遂写篇文章抛砖引玉。 0x1环境准备 ======= 我使用的是夜神模拟器配合 burpsuite 进行抓包。夜神模拟器我使用的是`6.6.1.1`的版本,算是很老的版本了,内设系统为`Android5.0`。新的版本中安卓似乎都是7.0以上了,抓取 HTTPS 包会比较麻烦,所以我就一直没有换版本。如果有需要的朋友可以自取,后面会打包云盘在文章底部。 首先我们需要设置好抓包环境,先通过`ipconfig`查看我们当前 ip,这里我用的是以太网,也就是插着网线;如果是连着 WIFI,则找对应的即可  在 burpsuite 添加上,这里我设置端口为`8888`,可以按照自己需求更改  打开夜神模拟器,在 WLAN 选择手动代理,并设置代理地址和代理端口,和 burpsuite 对应  保存后,打开浏览器访问`ip:port`,这里的话为`192.168.1.102:8888`,点击`CA Certificate`下载证书  打开文件管理器,在`sdcard->Download`目录中可以看到下载下来的证书  将`cacert.der`更名为`cacert.cer`,也就是将后缀改成`cer`,然后到手机设置->安全中,选择从 SD 卡安装  安装证书  测试一下,浏览器访问百度,burpsuite 能正常抓包说明已经设置环境成功  0x2反编译微信小程序代码 ============= 我们在模拟器里登录微信,然后随便选择一个微信小程序打开  打开文件管理器,在`data/data/com.tencent.mm/MicroMsg`会生成一个md5加密命名的文件夹(如果打开微信小程序过多,同时有多个文件夹不容易识别的情况,可以选择把`MicroMsg`文件夹所有内容删除掉,再去重新打开微信小程序,就会得到唯一一个MD5加密命名的文件夹啦)  在该文件夹下的`appbrand/pkg`目录下找到`.wxapkg`后缀结尾的文件,其中只有几MB大小的为刚刚打开的小程序的文件  点击勾选之后,来到根目录下的`mnt/shared/App`目录,打开右上角三个`.`的功能菜单选择粘贴选择项,将文件复制到该文件夹  这里的文件夹就是电脑共享的文件夹,点击打开电脑文件夹  可以找到小程序的文件  这里推荐有 GUI 界面的反编译工具:<https://github.com/ezshine/wxapkg-convertor/releases> 直接将文件鼠标拖拽到 GUI 界面即可开始反编译,在拖入文件的当前目录得到反编译生成的文件夹   然后就可以开始舒服的看看 js 代码啦  0x3反编译源码代码审计 ============ 举例某小程序审计,在登录界面爆破无关之后,直接反编译拖源码审计一下,反编译出来的源码,我们着重看 js 文件及其配置文件即可。第一想法就是先找一些接口,尝试是否有未授权之类的漏洞,下面就是找到的一处路由`user/getUserInfoByUsername`  可以看到发送数据类型为 json 格式,并且参数为`username`和`school`,于是尝试构造请求发送  成功获取系统管理员详细信息,其中包括关键的密码。获取到 md5 加密形式的密码密文后,本来还想去 cmd5 去解一下, 但是接下来注意到一个登录路由`user/loginByUsernameAndPassword`  从源码中都看得出来就是通过账号密码去登录,刚刚未授权得到的密码存储为 md5 加密形式,想来登录应该也是进行 md5 加密的形式,所以直接发送加密形式的密码即可,构造请求发送  验证登录成功。这类常常出现未授权漏洞的路由命名方式大抵都是 ```php xxxByXXXId xxxByUsername xxxbyphone ...... ``` 审计的时候我们可以做一个规则去全局搜索源码匹配这类命名方式的路由 0x4其他类型漏洞案例 =========== 下面举例其他类型的漏洞审计案例,这里目的是为了说明小程序有哪些漏洞可以挖 信息泄露 ---- 反编译出来的源码泄露登录账号密码,这里是因为在 js 文件中写死了账号密码,只做了前端验证导致的漏洞,从下面贴的两个小程序源码中可以看到   在时间稍稍往前的小程序中,还经常会有泄露小程序`secret`的情况,简直就是把打开保险箱的密码放在你面前 未授权接口 ----- 仔细翻找 js 文件能找到不少未鉴权的 api 接口(可以着重注意配置文件,不少配置文件都会写上路由列表),例如该 api 返回大量用户敏感信息  测试未授权时,有一些小技巧:例如当在 GET 或者 POST 传参中有`token`等鉴权参数,例如 ```php GET /api/GetUserInfo?id=xxx&token=xxxx HTTP/1.1 ``` 可以尝试将`token`参数的值置空或者删除`token`参数,往往能 bypass 鉴权,我已经遇见好多次这种情况了。举例一个案例: 该微信小程序可以注册用户,注册账号登录之后抓包,我的账号数据包如下 ```php GET /wx/queryOrders?orderState=&serviceUid=&repairUid=6864&pageNum=1&pageSize=20&uid=6864&token=9938C366-XXXX-XXXX-XXXX-9C7709D8C9E8 ``` 当我尝试将`uid`参数改成其他用户时,返回权限不足,尝试将`token`删除 ```php GET /wx/queryOrders?orderState=&serviceUid=&pageNum=1&pageSize=200&uid=2000 ```  除此之外,测试一些参数,比如手机号,不知道该系统用户手机号时,可以试试像上面说的将其置空,往往运气好能碰上系统后端查询使用的模糊查询为空时返回所有信息,下面贴图的案例就是将手机号参数置空后,成功获取到账号详细信息  越权漏洞 ---- 下面案例举例一个通过 Cookie 中的参数进行鉴权的漏洞,可以通过修改`NetId`中的值来遍历获取用户信息。此类漏洞的挖掘在鉴权处的源码,审计时可以着重审计其验证流程  当时也是依靠这个漏洞获取到 VPN 账号密码,得以进入内网渗透 逻辑漏洞 ---- 使用 burpsuite 抓取管理员登录数据包,获取返回包  该处在`login.js`文件登录判断条件中,源码判断返回为 0 时登录成功,所以我们将返回包从 1 改成 0 即可登录成功。  还有 **任意密码重置** ,该处漏洞倒也是在黑盒中无意发现,在修改密码处需要验证对应账号接收到的短信验证码。但怀着尝试的心态通过 buspsuite 抓包绕过 js 限制,随意填写验证码便可以重置任意用户密码,不细心就会很容易忽视的点  appid和secret的利用 --------------- 当时测试数据的时候,发现添加字符`%%`会导致其后端报错,返回`appid`和`secret`  获取到的appid和secret可以到微信的官方接口去自由生成微信小程序的命脉`AccessToken`  拿到 AccessToken,相当于可以控制整个小程序了,并且 AccessToken 微信每天只能生成20次,不断请求满20次的话可以使小程序崩溃无法使用。  其次利用AccessToken可以执行相当多的其他操作,见微信官方文档,这里就不画蛇添足了。 工具自取链接: ```php 链接:https://pan.baidu.com/s/1vMVvmm2n2wyr3vhzp91iqA 提取码:jpho ``` 0x5总结 ===== 总的来说,微信小程序的渗透我觉得最重要的还是仔细审计一下反编译得到的源码,常常会有意想不到的惊喜噢~
发表于 2022-02-22 09:46:30
阅读 ( 26312 )
分类:
渗透测试
18 推荐
收藏
8 条评论
DC3x6
2022-02-24 10:11
反编译源码那里可以直接在客户端微信实现,之前写了自动的工具。https://github.com/DC3x6/Unpack
请先
登录
后评论
无名之辈
2022-02-22 17:31
tql
请先
登录
后评论
Honeypot
2022-03-11 16:24
tql,师傅我那个微信一直抓不到包,是因为微信版本问题还是呢?
NoneSec
回复
judong
没看到哪里有
judong
回复
Honeypot
看我文章。。
请先
登录
后评论
dota_st
2022-03-16 14:26
可能与安卓版本有关吧,原因有很多种
请先
登录
后评论
xfWADE3号
2022-11-05 23:26
学习了,小程序必是以后渗透的重点。
请先
登录
后评论
nanfeng_
2022-11-16 22:54
师傅请问下,为什么拖入.wxapkg文件之后,在当前路径并无反编译之后的文件夹呢,期望回复!
请先
登录
后评论
请先
登录
后评论
dota_st
9 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!