问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
记一次小程序测试
渗透测试
一个简单的小程序渗透过程记录,大佬勿喷!
0x00 前言 ------- 前段时间公司搬家了,换了个大地方,现在进出都是人脸识别了。。感觉针不戳。。 但是,这个人脸识别系统,竟然要用一个看起来特别low的微信小程序去录入人脸。。 因此有了本文,**注意:本文纯属虚构,如有雷同,不胜荣幸** 0x01 反编译小程序 ----------- ### 导出 方法有很多,具体可以根据自己的环境百度,这里我的是越狱的iPhone 8p,ios14系统。 首先进入微信,把我们要测试的小程序删掉,然后重新搜索打开。 接着用`Filza`在根目录下搜索`WechatPrivate`,一般会出来四个结果,如下图:  挨个打开,文件最多的那个才是真的,我的如下:  然后找一个名字特别长的文件夹,我的是`4c4a440119a5023fb31f226b61a8026f`,接下来就是依次打开`/WeApp/LocalCache/release/`了。所有小程序都在这个`release`目录下了。  大体上,路径如下: ```path /var/mobile/Containers/Data/Application/{{系统UUID}}/Library/WechatPrivate/{{user哈希值}}/WeApp/LocalCache/release/ ``` 我的路径如下: ```path /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> ,安装如下: ```bash 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 ``` 反编译命令: ```bash ./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是写死在代码里的。  那还等啥,根据代码,本地写一个加密的脚本: ```javascript 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 后言 ------- 本次和开发的交锋持续了一个多月,没想到最后还是烂尾了。。 对了,再强调一遍,**本文纯属虚构,如有雷同,不胜荣幸!**
发表于 2021-12-20 09:34:56
阅读 ( 13088 )
分类:
渗透测试
17 推荐
收藏
3 条评论
zhiao
2021-12-20 17:37
好家伙,真就逮着一只羊使劲薅
请先
登录
后评论
行之
2021-12-21 13:25
师傅写的不错的,蛮好!
请先
登录
后评论
0x536d72
2022-10-24 17:46
wocao 老6!! 求对面开发的心里阴影!! 哈哈哈哈哈:这t,M的 哪个吊毛! 天天盯着我干啥啊! 哈哈哈哈
请先
登录
后评论
请先
登录
后评论
江南小虫虫
5 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!