本文以微信小程序为例,从实战入手,讲解有关于小程序这种新型攻击面的渗透,对于了解小程序的安全性和防范措施有一定的帮助。
作为中国特有的一种程序形态,小程序在我们的日常生活中已经无处不在。腾讯、百度、阿里巴巴、字节跳动、京东等各家互联网大厂都有各自的生态平台,当然,也有快应用这种行业联盟型的生态平台。
下载安装通过微信(扫描二维码、搜索、分享)即可获得从应用商店( 、应用汇等)下载安装内存占用无需安装,和微信共用内存使用,占用内存空间忽略不计安装于手机内存,一直占用内存空间,太多的 可能会导致内存不足手机适配一次,多终端适配需适配各种主流手机,成本大产品发布提交到微信公众平台审核,云推送向十几个应用商店提交审核,且各应用商店所需资料不一样,非常繁琐功能区别限于微信平台提供的功能对硬件资源的利用更加淋漓尽致,可以做出功能、设计、效果和流畅程度远远超过小程序的软件和服务传输要求必须使用 ,且绑定域名需要备案,不能直接使用 作为地址依照商自主要求, 传输可选可不选背景适合初创团队,试错成本低,需要较少时间和资金投入适合成熟的商业大,对自我品牌要求较高的企业
整个小程序框架系统分为两部分:逻辑层( )和 视图层()。小程序提供了自己的视图层描述语言 和 ,以及基于 的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统,让者能够专注于数据与逻辑。
小程序框架的逻辑层使用 引擎为小程序提供 代码的运行环境以及微信小程序的特有功能。
逻辑层将数据进行处理后发送给视图层,同时接受视图层的事件反馈。
者写的所有代码最终将会打包成一份 文件,并在小程序启动的时候运行,直到小程序销毁。这一行为类似 ,所以逻辑层也称之为 。
在 的基础上,微信增加了一些功能,以方便小程序的:
增加 和 方法,进行程序注册和页面注册。
增加 和 方法,分别用来获取 实例和当前页面栈。
提供丰富的 ,如微信用户数据,扫一扫,支付等微信特有能力。
提供模块化能力,每个页面有的作用域。
注意:小程序框架的逻辑层并非运行在浏览器中,因此 在 中一些能力都无法使用,如 ,等。
框架的视图层由 与 编写,由组件来进行展示。
将逻辑层的数据反映成视图,同时将视图层的事件发送给逻辑层。
( ) 用于描述页面的结构。
( ) 是小程序的一套脚本语言,结合 ,可以构建出页面的结构。
( ) 用于描述页面的样式。
组件()是视图的基本组成单元。
小程序包含一个描述整体程序的 和多个描述各自页面的 。
一个小程序主体部分由三个文件组成,必须放在项目的根目录,如下:.是小程序逻辑.是小程序公共配置.否小程序公共样式表
一个小程序页面由四个文件组成,分别是:是页面逻辑是页面结构否页面配置否页面样式表
注意:为了方便者减少配置项,描述页面的四个文件必须具有相同的路径与文件名。
从上述的架构图、文件组成部分来看,重点的就是小程序的逻辑层。而逻辑层主要的组成部分是由 .、.、 文件、 配置文件等组成,因此测试过程中主要的对象就是这一些。
小程序源代码获取工具
小程序源代码获取工具小程序解密
微信者工具调试获取的小程序代码抓包测试流量代理
笔者常用的搜索方式为使用微信官方小程序界面的搜索功能与零零信安科技有限的 0.平台,后者可以全自动采集目标企业()列表、下载地址和其详情介绍等信息,半自动进行小程序、公众、生活等的列表、名称和地址采集。较官方搜索功能,可以更精确的检索目标。
位置查找
使用版微信,打开待测试的小程序后,点击设置-文件管理-打开文件夹。
在 目录下有一个名为的文件夹,以“”开头的文件夹即为小程序文件夹。如果之前打开了很多微信小程序,那么目录中就会存在多个小程序文件夹。第一种区分方法是按照修改时间来进行区分。第二种方法是在微信页面中删除所有浏览过的小程序,重新打开需要进行测试的小程序,那么目录中只会存在一个小程序文件夹。
其中的文件名为,为加密后的文件。小程序解密
加密方法如下:
首先2生成的。利用微信小程序字符串为,为 选代次数为1000。调用2生成一个32位的。
取原始的的包的前1023个字节通过通过1生成的和( : 16 ),进行加密。
接着利用微信小程字符串的倒数第2个字符为 ,依次异或1023字节后的所有数据。如果微信小程序小于2位,则 为 066。
把加密后的数据 (1024字节)和后的数据一起写入文件,并在文件头部添加1标识。
这里使用的解密工具为代码果所编写.,用法为点击“选择加密小程序包”,选中待解密的,将会在.当前目录的文件夹中生成解密后的文件。
注意:一定要选择微信小程序原始位置,待测试的文件将会导致无法识别,导致解密失败!
包文件结构
在解密之后,使用010打开该文件,可以看出,包由三个部分组成,分别是头部段、索引段、数据段。头部段
以“”开头,''结尾,其中包含4个“00”空白填充,进行校验的索引段长度块、数据段长度块各四位,固定长度为14字节。
索引段
首先为4字节,为包内文件的数量,如“00 00 00 5”代表一共有95个文件,然后是包内文件各自的信息,例:“00 00 00 16”代表文件名称的长度为22个字节,“2 72 65 6...... 2 70 6 67”为带存放路径的文件名称,“00 00 11 7”对应文件在小程序包中的具体偏移位置,“00 01 01 7“对应文件在小程序包中的数据长度。
数据段
数据段为存储的文件内容,可通过索引段的信息进行一一对应。
小程序反编译
通过索引段与数据段,我们已经可以还原出一个大体的文件结构
但这并不是最初的原项目文件结构,原因是微信服务器会将小程序源码中所有的“”文件压入“-.”文件中,将所有的“”文件压入“-.”中,将所有的“”文件压入“-.”文件中,“”则在处理之后以“”文件的形式存留在对应页面目录之下。
笔者对各自文件的还原不再赘述,在此推荐使用与,二者均可以直接对解密后的包进行反编译,直接还原出原项目的文件结构。
的使用命令为:
的使用更为便携,将待反编译的包直接拖入程序窗口中,即可在小程序包位置的同目录下获得同名的小程序项目文件夹。常见问题存在分包(即文件夹下有多个.文件)
分别解密,反编译后,拼合到同一目录下。使用后,”-.” / “-.” / “-.” / “.”文件未成功反编译:
将 -. 中的内容拆分成各个页面所对应的 . 和 .;
将 -. 拆分成一系列原先的 文件,并使用 - 美化工具尽可能将代码还原为“编译”前的内容;
从 -. 中提取并还原各页面的 . 和 . 及公共 . 样式文件;
该命令参数为 . 解包后目录,它将并从各个 . 中提取还原各页面的 . 样式文件。
在获取到源码后,我们可以将其加载到微信者工具中进行调试。
下面列出实战时常见的微信小程序漏洞信息泄露
敏感信息是指一旦泄露可能会对者的业务、合作伙伴和用户带来利益损害的数据,包括但不限于账 、特权账信息、后台加密密钥、登录账户、用户身份证、手机、银行等。
可利用微信者工具中的搜索功能来搜索如“”、“”、“”等关键字。
这里说一下针对与的利用,在获取到该信息后,可访问微信开放平台调试工具(可根据小程序的代码内容配合接口文档进行进一步的利用。
提示:微信小程序者工具在1.06.20版本以后在代码质量模块中增加针对 的检测,故泄露只可能在2025-06-02以前的小程序中发现。
注入
注入是指 程序代码中对于用户提交的参数未做有效过滤就直接拼接到 语句中执行,导致参数中的特殊字符打破了 语句原有逻辑,黑客可以利用该漏洞执行任意 语句。
通过的流量代理与的抓包,我们可以针对小程序运行时的功能点进行测试。
配置:
设置为127.0.0.1,端口自定义的协议代理服务器
添加规则:程序“.”,动作为刚才设置的代理服务器
配置:
配置代理服务器,端口为刚才设置的自定义端口,地址为127.0.0.1
通过对小程序功能点进行注入测试,成功返回数据库用户名。
弱口令
弱口令指管理后台的用户名设置得较为简单或者使用默认账。攻击者可以通过登录这些账修改后台数据或进行下一步的入侵操作。
针对小程序的代码进行审计,发现一处回连域名,访问发现为管理后台。
使用用户名: :6 成功登陆后台,获取大量信息。
常见问题将反编译后的源码导入微信者工具后,报错 “.错误:: _3 ”
按错误提示找到文件 @///.
将所有内容删除,并替换成
报错“依赖异常”
为程序在反编译过程中对变量还原不准确,通过对比已还原的目录结果删除调用代码中多余路径即可修复。
小程序者在环节中必须基于以下原则:
互不信任原则,不要信任用户提交的数据,包括第三方系统提供的数据,必要的数据校验必须放在后台校验。
最小权限原则,代码、模块等只拥有可以完成任务的最小权限,不赋予不必要的权限。
禁止明文保存用户敏感数据。
小程序代码(不包括云函数代码)跟传统 应用的前端代码类似,可被外部获取及进行反混淆,重要业务逻辑应放在后台代码或云函数中进行。
后台接口调用以及云函数调用,必须进行有效的身份鉴权。
来源: