前言

无论是攻防演练还是SRC挖掘,小程序渗透测试已经成为了传统web打点之外、信息收集的重要一步。

17年微信小程序上线,vx小程序的定位是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验

小程序并非凭空冒出来的一个概念。当微信中的 WebView 逐渐成为移动 Web 的一个重要入口时,微信就有相关的 JS API 了。

它的主要开发语言也是 JavaScript ,小程序的开发同普通的网页开发相比有很大的相似性。因为是JavaScript,所以还是基于用户端运行,也就出现了小程序反编译导致信息泄露的可能。下面就从一个实际项目了解vx小程序的项目结构

小程序项目结构

项目地址:yllg/WXxcx: 微信小程序-e生活

在微信开发者工具中导入e生活项目,打开后IDE自动开启热加载

image-20230708155711894

小程序包含一个描述整体程序的 app 和多个描述各自页面的 page

一个小程序主体部分由三个文件组成,必须放在项目的根目录,如下:

文件 必需 作用
app.js 小程序逻辑
app.json 小程序公共配置,是当前小程序的全局配置,包括了小程序的所有页面路径、界面表现、网络超时时间、底部 tab 等
app.wxss 小程序公共样式表(相当于css样式表)

​ 一个小程序页面部分由四个文件组成,通常放在pages目录下,分别是:

文件类型 必需 作用
.js 页面逻辑
.wxml 页面结构
.json 页面配置
.wxss 页面样式表

注意:为了方便开发者减少配置项,描述页面的四个文件必须具有相同的路径与文件名。

image-20230708155906130

重要文件 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。

image-20230709001431848

.wxapkg文件

通常小程序编译后,生成.wxapkg文件,每次打开小程序时微信会自动缓存小程序的.wxapkg文件

  • wx的数据存储位置,默认在安装的目录下的 WeChat Files目录下

image-20230708213058997

  • 小程序的位置在 WeChat Files\Applet目录下

每个文件夹就是个小程序,文件名其实就是wx+APPID,我们可以删除所有的文件再加载要测试的小程序,方便我们确定要反编译的小程序

image-20230709142750074

PC端小程序解密和反编译

对于最后拿到小程序的源码的过程,大致分为两步

  1. wx小程序数据包解密
  2. 将解密后的数据包反编译得到源码

wx小程序多端代码基本差不多,PC端最方便,这里就以pc端为例

小程序数据解密

解密思路参考,微信小程序逆向解密-软件逆向-看雪-安全社区

也可以使用代码果打包的gui,不要移动小程序包的位置,否则解密失败

找到加密的小程序报的位置

image-20230709170625041

导入WeChat Files文件夹下的小程序数据,得到解密后的wx081d27880a575cb3.wxapkg

image-20230709122811488

小程序数据反编译

拿到了解密后的小程序内容,还需要反编译得到我们可读的代码

项目地址:system-cpu/wxappUnpacker: 基于node反编译小程序 已经配置完成 (github.com)

Windows用bingo.bat脚本批处理,wxapp是我们自己创建文件夹,把上面的到的wx081d27880a575cb3.wxapkg放在里面

image-20230709122916214

cmd运行,bingo.bat + 文件路径,直接把文件拖进cmd就行

image-20230709123149966

wxapp目录下生成和wx081d27880a575cb3同名的文件夹,反编译成功

image-20230709131553658

反编译得到的文件还需要我们进一步的挖掘, app.js文件中的 globalData 就是我们常见的入口, 这里可能有开发者配置的key等, 如下

image-20230709165028911

拿到代码后就各自发挥了: )