一个简单的小程序渗透过程记录,大佬勿喷!
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直接好家伙。。把敏感信息都删掉,只留下userId
和userName
,这就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
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!