由于小程序的便捷性,越来越多的应用迁移到了了小程序上,由此伴随着小程序上线前的日常渗透测试工作也开始增加。但小程序的测试中经常会遇到数据包被加密了,导致无法进行改包测试。和测试网页数据包加密一样,就需要找到小程序前端相应的加解密方法进行加解密数据包改包测试。
不同于网页f12查看网页源码即可查看搜索相应加解密函数,小程序虽然也是三大组件但其前端源码存放在微信安装包的wxapkg包中,我们需要使用一个root设备提取处相应的wxapkg包,并还原出前端源码。文件一般位于 /data/data/com.tenc ent.mm/MicroMsg/appbrand/pkg/(安卓系统,以下测试都在安卓机下进行)目录下。
提取的时候需要准备一台root手机或使用夜神等模拟器均可,然后使用adb进入/data/data/com .tencent.mm/MicroMsg/appbrand/pkg/,提取相应的文件。由于wxapkg的命名时随机的,可以使用ls -al 命令根据你所安装小程序时间来判断提取相应小程序的wxapkg包。.wxapkg是一个二进制文件,有其自己的一套结构,具体可以参考该链接。
接下来就需要对wxapkg文件进行反编译提取相应的前端源码,一般是搭建nodejs环境进行反编译还原。我比较懒不太想搭喜欢用傻瓜式操作,这边推荐一个小程序反编译工具CrackMinApp,具有图形化的操作界面及所需依赖环境。界面长这样:
下载和操作指南可以参考它的github项目,还原后的前端源码就这样:
第一步就是要找到前端源码中的加解密的方法,一行行代码去找肯定不现实太费时间,一般都全局搜 encrypt、decrypt、AES、DES、RSA这些关键词。一般来说基本都用对称加密且AES出现的频率最高,如下所示直接找到相应的加解密方法和密码。
用的还是ECB模式这这这。之后就好办了开始测试发现两个高危,中低危就不描述了,说实话加密的数据包解密后一般漏洞较多。
在忘记密码处输入手机号点击发送验证码,如下所示:
在验证码输入框内输入任意6位数字,如下所示:
点击下一步,拦截服务器返回数据包,如下所示:
数据包内容解密结果如下:
将返回数据包改成如下形式{"code":200},加密后数据包发至客户端,欺骗成功跳转至设置密码处如下所示:
设置任意密码提交后即可成功修改密码,如下所示:
利用修改完的密码可成功登录,从而实现任意用户密码修改。
在发现处搜索项目抓取相应的数据包,重放返回如下数据信息:
解密后为项目数据信息,如下所示:
修改POST参数值itemName为’,发现服务器返回500错误如下所示:
由于服务端返回的数据项目名称为例如某某公司,POST数据输入搜索参数为该公司名称有数据返回,输入搜索关键词为"公司“时无数据返回,故猜测sql语句逻辑为模糊查询为如下所示:
'select * from table where clo like '+canshu+'%'
故构造payload首先猜测数据库用户名长度如下所示:
{"pageNum":1,"pageSize":10,"itemName":"%' and concat((case when length(user)>=3 then '1' else '0' end),'%')='1","bondName":""}
加密后在POST包中发送如下所示当长度大于等于3时返回正常,大于等于4时无数据返回,故判断得到数据库用户名长度为3,如下所示:
同理构造如下payload猜测数据库用户名,如下所示:
{"pageNum":1,"pageSize":10,"itemName":"%' and concat((case when ascii(substr(user,3,1))>=67 then '1' else '0' end),'%')='1","bondName":""}
之后就不深入了,测完收工。