整个小程序框架系统分为两部分:逻辑层(AppService)和视图层(View)。小程序提供了自己的视图层描述语言WXML和WXSS,以及基于JavaScript的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统,让开发者能够专注于数据与逻辑。
逻辑层将数据进行处理后发送给视图层,同时接受视图层的事件反馈。
开发者写的所有代码最终将会打包成一份JavaScript文件,并在小程序启动的时候运行,直到小程序销毁。这一行为类似ServiceWorker,所以逻辑层也称之为AppService。
注意:小程序框架的逻辑层并非运行在浏览器中,因此JavaScript在web中一些能力都无法使用,如window,document等。
框架的视图层由WXML与WXSS编写,由组件来进行展示。
将逻辑层的数据反映成视图,同时将视图层的事件发送给逻辑层。
WXML(WeiXinMarkuplanguage)用于描述页面的结构。
WXS(WeiXinScript)是小程序的一套脚本语言,结合WXML,可以构建出页面的结构。
WXSS(WeiXinStyleSheet)用于描述页面的样式。
组件(Component)是视图的基本组成单元。
小程序包含一个描述整体程序的app和多个描述各自页面的page。
一个小程序主体部分由三个文件组成,必须放在项目的根目录,如下:
一个小程序页面由四个文件组成,分别是:
注意:为了方便开发者减少配置项,描述页面的四个文件必须具有相同的路径与文件名。
从上述的架构图、文件组成部分来看,重点分析的就是小程序的逻辑层。而逻辑层主要的组成部分是由app.js、app.json、js文件、json配置文件等组成,因此测试过程中主要分析的对象就是这一些。
windows
其中的文件名为__APP__.wxapkg,为加密后的文件。
加密方法如下:
这里使用的解密工具为代码果所编写UnpackMiniApp.exe,用法为点击“选择加密小程序包”,选中待解密的__APP__.wxapkg,将会在UnpackMiniApp.exe当前目录的wxpack文件夹中生成解密后的文件。
在解密之后,使用010Editor打开该文件,可以看出,wxapkg包由三个部分组成,分别是头部段、索引段、数据段。
首先为4字节,为包内文件的数量,如“0000005F”代表一共有95个文件,然后是包内文件各自的信息,例:“00000016”代表文件名称的长度为22个字节,“2F72656F......2E706E67”为带存放路径的文件名称,“0000117C”对应文件在小程序包中的具体偏移位置,“000101F7“对应文件在小程序包中的数据长度。
数据段为存储的文件内容,可通过索引段的信息进行一一对应。
通过索引段与数据段,我们已经可以还原出一个大体的文件结构
笔者对各自文件的还原不再赘述,在此推荐使用wxappUnpacker与wxapkgconvertor,二者均可以直接对解密后的wxapkg包进行反编译,直接还原出原项目的文件结构。
wxappUnpacker的使用命令为:
wxapkgconvertor的使用更为便携,将待反编译的wxapkg包直接拖入程序窗口中,即可在小程序包位置的同目录下获得同名的小程序项目文件夹。
分别解密,反编译后,拼合到同一目录下。
SQL注入是指Web程序代码中对于用户提交的参数未做有效过滤就直接拼接到SQL语句中执行,导致参数中的特殊字符打破了SQL语句原有逻辑,黑客可以利用该漏洞执行任意SQL语句。
通过proxifier的流量代理与BurpSuite的抓包,我们可以针对小程序运行时的功能点进行测试。
proxifier配置:
设置ip为127.0.0.1,端口自定义的HTTPS协议代理服务器
添加规则:程序“wechatappex.exe”,动作为刚才设置的代理服务器
BurpSuite配置:
配置代理服务器,端口为刚才设置的自定义端口,地址为127.0.0.1
通过对小程序功能点进行SQL注入测试,成功返回数据库用户名。
针对小程序的代码进行审计,发现一处回连域名,访问发现为管理后台。
使用用户名:admin密码:123456成功登陆后台,获取大量信息。
按错误提示找到文件@babel/runtime/helpers/typeof.js
将所有内容删除,并替换成
小程序开发者在开发环节中必须基于以下原则:
互不信任原则,不要信任用户提交的数据,包括第三方系统提供的数据,必要的数据校验必须放在后台校验。
最小权限原则,代码、模块等只拥有可以完成任务的最小权限,不赋予不必要的权限。
禁止明文保存用户敏感数据。
小程序代码(不包括云函数代码)跟传统Web应用的前端代码类似,可被外部获取及进行反混淆,重要业务逻辑应放在后台代码或云函数中进行。