渗透技巧 -- vx小程序实例分析和反编译拿源码
前言
无论是攻防演练还是SRC挖掘,小程序渗透测试已经成为了传统web打点之外、信息收集的重要一步。
17年微信小程序上线,vx小程序的定位是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验
小程序并非凭空冒出来的一个概念。当微信中的 WebView 逐渐成为移动 Web 的一个重要入口时,微信就有相关的 JS API 了。
它的主要开发语言也是 JavaScript ,小程序的开发同普通的网页开发相比有很大的相似性。因为是JavaScript,所以还是基于用户端运行,也就出现了小程序反编译导致信息泄露的可能。下面就从一个实际项目了解vx小程序的项目结构
小程序项目结构
在微信开发者工具中导入e生活项目,打开后IDE自动开启热加载
小程序包含一个描述整体程序的 app
和多个描述各自页面的 page
。
一个小程序主体部分由三个文件组成,必须放在项目的根目录,如下:
文件 | 必需 | 作用 |
---|---|---|
app.js | 是 | 小程序逻辑 |
app.json | 是 | 小程序公共配置,是当前小程序的全局配置,包括了小程序的所有页面路径、界面表现、网络超时时间、底部 tab 等 |
app.wxss | 否 | 小程序公共样式表(相当于css样式表) |
一个小程序页面部分由四个文件组成,通常放在pages目录下,分别是:
文件类型 | 必需 | 作用 |
---|---|---|
.js | 是 | 页面逻辑 |
.wxml | 是 | 页面结构 |
.json | 否 | 页面配置 |
.wxss | 否 | 页面样式表 |
注意:为了方便开发者减少配置项,描述页面的四个文件必须具有相同的路径与文件名。
重要文件 app.js
每个小程序都需要在 app.js
中调用 App()
方法注册小程序实例,绑定生命周期回调函数、错误监听和页面不存在监听函数等。
// app.js
App({
onLaunch (options) {
// Do something initial when launch.
},
onShow (options) {
// Do something when show.
},
onHide () {
// Do something when hide.
},
onError (msg) {
console.log(msg)
},
globalData: 'I am global data'
})
整个小程序只有一个 App 实例,是全部页面共享的。开发者可以通过 getApp()
方法获取到全局唯一的 App 实例,获取App上的数据或调用开发者注册在 App.js
上的函数。
// xxx.js
const appInstance = getApp()
console.log(appInstance.globalData) // I am global data
获取app.js中注册的globalData的数据
所以 app.js 是我们需要重视的内容,很多开发者经常把一些api接口数据或者key写在globalData
其中以便page页面进行调用访问,甚至为了调用云上的服务而把access key
写入其中,比如上面的e生活项目,就把个人调用服务的key写在了app.js。
.wxapkg文件
通常小程序编译后,生成.wxapkg
文件,每次打开小程序时微信会自动缓存小程序的.wxapkg文件
- wx的数据存储位置,默认在安装的目录下的
WeChat Files
目录下
- 小程序的位置在 WeChat Files\Applet目录下
每个文件夹就是个小程序,文件名其实就是wx+APPID,我们可以删除所有的文件再加载要测试的小程序,方便我们确定要反编译的小程序
PC端小程序解密和反编译
对于最后拿到小程序的源码的过程,大致分为两步
- wx小程序数据包解密
- 将解密后的数据包反编译得到源码
wx小程序多端代码基本差不多,PC端最方便,这里就以pc端为例
小程序数据解密
解密思路参考,微信小程序逆向解密-软件逆向-看雪-安全社区
也可以使用代码果打包的gui,不要移动小程序包的位置,否则解密失败
找到加密的小程序报的位置
导入WeChat Files文件夹下的小程序数据,得到解密后的wx081d27880a575cb3.wxapkg
小程序数据反编译
拿到了解密后的小程序内容,还需要反编译得到我们可读的代码
项目地址:system-cpu/wxappUnpacker: 基于node反编译小程序 已经配置完成 (github.com)
Windows用bingo.bat脚本批处理,wxapp是我们自己创建文件夹,把上面的到的wx081d27880a575cb3.wxapkg放在里面
cmd运行,bingo.bat + 文件路径,直接把文件拖进cmd就行
wxapp目录下生成和wx081d27880a575cb3同名的文件夹,反编译成功
反编译得到的文件还需要我们进一步的挖掘, app.js文件中的 globalData 就是我们常见的入口, 这里可能有开发者配置的key等, 如下
拿到代码后就各自发挥了: )