记一次小程序测试

admin 2022年12月19日10:37:46评论30 views字数 3125阅读10分25秒阅读模式

一个简单的小程序渗透过程记录,大佬勿喷!

0x00 前言

前段时间公司搬家了,换了个大地方,现在进出都是人脸识别了。。感觉针不戳。。

但是,这个人脸识别系统,竟然要用一个看起来特别low的微信小程序去录入人脸。。

因此有了本文,注意:本文纯属虚构,如有雷同,不胜荣幸

0x01 反编译小程序

导出

方法有很多,具体可以根据自己的环境百度,这里我的是越狱的iPhone 8p,ios14系统。

首先进入微信,把我们要测试的小程序删掉,然后重新搜索打开。

接着用Filza在根目录下搜索WechatPrivate,一般会出来四个结果,如下图:

记一次小程序测试

挨个打开,文件最多的那个才是真的,我的如下:

记一次小程序测试

然后找一个名字特别长的文件夹,我的是4c4a440119a5023fb31f226b61a8026f,接下来就是依次打开/WeApp/LocalCache/release/了。所有小程序都在这个release目录下了。

记一次小程序测试

大体上,路径如下:

/var/mobile/Containers/Data/Application/{{系统UUID}}/Library/WechatPrivate/{{user哈希值}}/WeApp/LocalCache/release/

我的路径如下:

/var/mobile/Containers/Data/Application/8B112216-AFF4-4B57-9952-F9278346F9B6/Library/WechatPrivate/4c4a440119a5023fb31f226b61a8026f/WeApp/LocalCache/release/

release目录下,点两下日期让它按照时间从最新到最旧排序,因为我们刚刚删除并重新添加了我们要测试的小程序,因此,这时候,第一个文件夹(最近修改)就是存放目标小程序的文件夹了,我的是wx7a1068b8417ddea1。不放心的同学可以点一下文件夹右边的叹号,点开之后可以就看到最后修改时间了。

点开该文件夹,就可以看到小程序了,为wxapkg后缀,我的如下:

记一次小程序测试

然后点击图中小程序右边的叹号,点击路径,选择复制,复制该小程序的路径

记一次小程序测试

然后在Filza的设置中启用WebDAV服务,用电脑访问这个链接,定位到小程序的位置,把这个小程序下载到电脑上即可

记一次小程序测试

记一次小程序测试

反编译

小程序有了,接下来是反编译。这里用到的工具是:https://github.com/xuedingmiaojun/wxappUnpacker ,安装如下:

git clone https://github.com/xuedingmiaojun/wxappUnpacker
cd wxappUnpacker
# 加速npm
npm config set registry https://registry.npm.taobao.org
npm install
npm install esprima css-tree cssbeautify vm2 uglify-es js-beautify escodegen

反编译命令:

./bingo.sh /path/to/小程序.wxapkg

记一次小程序测试

命令执行成功,就会在/path/to/小程序.wxapkg路径下生成一个同名的目录, 打开这个目录就能看到源码了。

记一次小程序测试

0x03 第一次交锋

发现

打开代码,找找接口,发现了一个getUserListByCompanyId接口,只需要传入公司的id和用户id,不需要token之类的身份认证信息,就能获得用户列表。

记一次小程序测试

不多bb,直接bp走起,可以看到,轻轻松松的,这个公司底下的所有成员信息,包括姓名、手机号、邮箱等等都到手了。。。只需要把这个companyId遍历一遍,社工库+1+1+1+1。。。开玩笑的,我肯定不会这样子干滴。

记一次小程序测试

到此,因为当时搬砖任务还没完成,所以先把这个洞提到cnvd,剩下的就没看了。。

然后,被领导瞄到我在摸鱼,然后拿去送人情了。。。但我cnvd都提了。。那就看是cnvd审核快,还是开发修复快了。。

修复

过了几天,我打开cnvd一看,果不其然,还是开发修得快。。。

我不是说cnvd审核慢

记一次小程序测试

然后我在摸鱼的时候,bp看了一下。。。我TM直接好家伙。。把敏感信息都删掉,只留下userIduserName,这就ok了?

记一次小程序测试

他们说没问题,就没问题了呗,我还能怎么样?

0x04 第二次交锋

发现

既然这个点不行了,我就再找找其他接口呗,重新反编译最新的小程序,果然发现了如下修改手机号的接口:

记一次小程序测试

可以看到,只需要手机号,验证码,和用户id,就可以修改用户的手机号了。那验证码去哪里搞?往上找找

记一次小程序测试

发现了发短信的接口,只需要手机号+用户id就行,那还等啥,直接bp开冲。其中的phoneNum改成攻击者的手机号就行

记一次小程序测试

然后把攻击者手机收到的短信填入code值中

记一次小程序测试

最后成功把该用户的手机号改成了攻击者的手机号,并且接口返回了该人员的全部信息,包括姓名、手机号、邮箱、人脸等,社工库+1+1+1。

整理一下,提交cnvd,收工!!

修复

过了一段时间,发现cnvd已经审批通过了,再过了一段时间,再访问,发现接口变了,多了个data字段。

记一次小程序测试

0x05 第三次交锋

发现

老样子,反编译最新的小程序代码,发现对请求体加密了

记一次小程序测试

查看getEncryption的定义,原来是把原来的请求都丢到了data字段,然后增加了一个sign,其值是aes加密的

记一次小程序测试

而且key是写死在代码里的。

记一次小程序测试

那还等啥,根据代码,本地写一个加密的脚本:

var CryptoJS = require("crypto-js");

var n ={
"companyId":"1",
"userId":"1"
}

// var n = {
// phoneNum: "13xxxxxxxxx",
// sign: "updatePhoneNum",
// userId: "1"
// }

//var n = {
// phoneNum: "13xxxxxxxxx",
// code: "185737",
// userId: "1"
//}

var r = CryptoJS.enc.Utf8.parse("aeskey")

function getEncryption(t) {
var e = JSON.stringify(t);
return {
data: e,
sign: CryptoJS.AES.encrypt(e, r, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}).toString()
};
}

console.log(getEncryption(n));

效果如下:

记一次小程序测试

然后跟之前一样的操作,成功修改手机号

记一次小程序测试

记一次小程序测试

但是此时,修改成功后,没有返回该人员的信息,只返回了攻击者的手机号。。可以说开发确实用心在修复了。。但是我手机号都改了,直接在小程序登录不也一样可以看到该人员信息?

记一次小程序测试

继续提交cnvd,收工

修复

过了一段时间再看,好家伙,开发把所有用到短信的接口都给干掉了。。。什么更换手机号、忘记密码全部用不了了。。。

果然,解决安全问题,最好的办法是把提出问题的人给解决掉,其次是把产生问题的功能给砍掉。。。

0x06 后言

本次和开发的交锋持续了一个多月,没想到最后还是烂尾了。。

对了,再强调一遍,本文纯属虚构,如有雷同,不胜荣幸

原文地址:https://forum.butian.net/share/988


 热文推荐  


欢迎关注bgbing安全

原文始发于微信公众号(bgbing安全):记一次小程序测试

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年12月19日10:37:46
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记一次小程序测试https://cn-sec.com/archives/1472182.html

发表评论

匿名网友 填写信息