渗透测试|记一次小程序测试

01be5ee356a21740f7161b53e4573de3

0x00 前言

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

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

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

0x01 反编译小程序

导出

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

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

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

渗透测试|记一次小程序测试

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

渗透测试|记一次小程序测试

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

渗透测试|记一次小程序测试

大体上,路径如下:

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

我的路径如下:

  1. /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 ,安装如下:

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

反编译命令:

  1. ./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审核慢

image-20211215001929761

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

image-20211215002818948

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

0x04 第二次交锋

发现

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

image-20211215113616925

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

image-20211215113722091

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

image-20211215003043046

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

image-20211215003110605

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

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

修复

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

image-20211215120052201

0x05 第三次交锋

发现

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

image-20211215120347624

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

image-20211215120441685

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

image-20211215120556433

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

  1. var CryptoJS = require("crypto-js");
  2. var n ={
  3. "companyId":"1",
  4. "userId":"1"
  5. }
  6. // var n = {
  7. // phoneNum: "13xxxxxxxxx",
  8. // sign: "updatePhoneNum",
  9. // userId: "1"
  10. // }
  11. //var n = {
  12. // phoneNum: "13xxxxxxxxx",
  13. // code: "185737",
  14. // userId: "1"
  15. //}
  16. var r = CryptoJS.enc.Utf8.parse("aeskey")
  17. function getEncryption(t) {
  18. var e = JSON.stringify(t);
  19. return {
  20. data: e,
  21. sign: CryptoJS.AES.encrypt(e, r, {
  22. mode: CryptoJS.mode.ECB,
  23. padding: CryptoJS.pad.Pkcs7
  24. }).toString()
  25. };
  26. }
  27. console.log(getEncryption(n));

效果如下:

image-20211215004654689

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

image-20211215003222966

image-20211215120750520

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

渗透测试|记一次小程序测试

继续提交cnvd,收工

修复

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

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

0x06 后言

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

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

本文来自投稿,不代表安强科技社区立场,如若转载,请注明出处:https://community.anqiangkj.com/archives/2743

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年1月13日 下午11:31
下一篇 2022年1月14日 上午12:00

相关推荐

发表回复

您的电子邮箱地址不会被公开。