⚠️本博文所涉安全渗透测试技术、方法及案例,仅用于网络安全技术研究与合规性交流,旨在提升读者的安全防护意识与技术能力。任何个人或组织在使用相关内容前,必须获得目标网络 / 系统所有者的明确且书面授权,严禁用于未经授权的网络探测、漏洞利用、数据获取等非法行为。

前言

在SRC漏洞挖掘中,微信小程序正逐渐成为不可忽视的重要攻击面。由于小程序的封闭运行环境和微信生态的便捷登录特性,许多开发者在安全设计上容易产生认知偏差——认为"小程序环境安全,无需严格校验"。这种认知导致了大量逻辑漏洞、越权漏洞和身份认证漏洞的存在。本文将系统性地介绍微信小程序的安全测试方法论,帮助读者建立完整的小程序渗透测试思维体系。


一、小程序安全测试概述

1. 小程序 vs Web 安全测试的差异

核心区别:

对比项Web应用微信小程序
运行环境浏览器微信内置WebView + JSBridge
登录方式账号密码/第三方OAuth微信一键登录/手机号快捷登录
代码获取直接查看前端源码需要反编译获取
抓包难度相对简单需要配置代理穿透
XSS/CSRF常见攻击面非嵌套网页时基本不存在
加密逻辑可选前端加密常强制前端加密

重要认知:小程序不是"更安全的Web应用"。如果不嵌套外部网页,确实不存在传统意义上的XSS和CSRF漏洞,但逻辑漏洞、越权漏洞、身份认证漏洞的发生率并不比Web应用低,甚至在某些场景下更高。

2. 小程序作为渗透入口的价值

为什么重视小程序:

  • 小程序是独立的攻击面,与Web端的安全措施可能不一致
  • 小程序后端API往往与Web端共用,但权限校验可能不同
  • 小程序的前端加密逻辑更容易暴露密钥
  • 低权限身份(如访客、临时用户)在小程序中往往防护更弱
  • 很多厂商对小程序的安全重视程度低于Web端

核心原则:小程序是重要的渗透入口,不要忽视其安全测试价值。


二、信息收集:小程序测试的第一步

1. 抓包环境配置

Proxifier + BurpSuite

原理:小程序的网络请求不走系统代理,需要通过Proxifier将微信进程的流量强制转发到BurpSuite。

配置步骤:

  1. Proxifier中添加代理服务器(BurpSuite监听的IP和端口)
  2. 创建代理规则,将WeChat.exe的流量指向代理服务器
  3. 在BurpSuite中安装微信内置证书(可能需要通过小程序触发HTTPS请求后导入)
Reqable + BurpSuite

特点:Reqable是更现代的抓包工具,对小程序的支持更友好,配置相对简单。

注意事项
  • 小程序首次加载时可能校验证书,需要安装系统级信任证书
  • 部分小程序使用SSL Pinning,需要配合Frida等Hook工具绕过
  • iOS和Android的小程序抓包难度不同,Android相对更容易

2. 小程序反编译

反编译工具链

常用工具:

  • wedecode:功能完善的小程序反编译工具
  • fine:支持多种小程序格式的反编译
  • wxapkg:专注于小程序包解析
  • UnpackMiniApp:配合PC端微信提取小程序包

PC端小程序包获取:

  • PC端微信打开小程序后,本地会生成小程序包文件
  • 不同页面可能对应不同的包,需要逐个提取
  • 包文件路径通常在微信安装目录下的特定文件夹中
反编译后的信息提取

重点关注内容:

  • API接口路径:搜索type:"POST"、url:、path:等关键字,提取所有后端接口
  • 加密算法:搜索AES、encrypt、decrypt、key、iv、3DES等关键词
  • 硬编码密钥:密钥和IV常直接写在前端代码中
  • 隐藏页面路由:前端Bundle中常打包所有页面路由,包括未开放的隐藏页面
  • 环境配置:开发/测试/生产环境的API基址、AppID等配置信息

3. 框架识别

为什么要识别框架:

  • 不同框架有标准的接口路径和已知漏洞模式
  • 可以快速定位有效API,提高测试效率

常见框架特征:

  • 若依框架:/getInfo、/getRouters、/system/user/list
  • JeecgBoot:/jeecg-boot/前缀
  • 自研框架:通过URL结构和响应格式判断

识别方法:

  • 从抓包中的API路径特征判断
  • 从响应数据的字段结构判断
  • 从静态资源URL判断

三、登录认证测试

1. 手机号快捷登录

场景描述:小程序通过微信提供的getPhoneNumber接口获取用户手机号,实现一键登录。

核心风险:如果后端仅依赖手机号做身份认证,未校验请求信息的完整性,可能导致任意用户登录。

测试思路

方法一:修改请求体中的加密数据

前提条件:小程序登录流程中,前端获取加密数据后发送给后端解密。如果拦截并修改加密数据中的用户标识,后端可能直接使用修改后的值。

测试步骤:

  1. 正常登录流程中抓包,获取登录请求中的加密数据
  2. 拦截请求,不立即放行
  3. 分析加密数据结构,找到用户标识字段(如手机号、openId)
  4. 修改用户标识为目标用户
  5. 重新发送请求,观察是否以目标用户身份登录

关键观察:登录后需要查看其他功能是否同步显示目标用户的数据,确认是否真正接管了目标账号。

方法二:修改响应体中的身份字段

测试步骤:

  1. 使用自己账号正常登录
  2. 拦截登录响应包
  3. 修改响应中的身份字段(如phoneNumber、purePhoneNumber、userId)
  4. 放行修改后的响应包
  5. 观察小程序后续请求是否使用修改后的身份标识

核心原理:如果服务端在登录后仅以客户端传入的身份标识为准,不校验Token与身份的绑定关系,则可通过篡改响应包实现身份伪造。

加密数据解密测试

核心原则:当发现HTTP响应中包含加密敏感数据时,直接逆向前端代码。

判断方法:

  • 确定是"后端控制返回"还是"前端控制解密"
  • 如果前端判断权限后解密,则后端已经返回了全部数据

逆向步骤:

  1. 抓包确认加密数据的存在
  2. 反编译小程序获取源码
  3. 搜索加密关键词(AES/encrypt/decrypt/key/iv/3DES)
  4. 定位密钥和算法参数
  5. 编写解密脚本验证

常见缺陷:密钥直接硬编码在客户端代码中,可通过反编译直接获取。

2. 弱口令探测

测试思路:

  • 不要被前端输入限制迷惑(如仅限手机号输入),后端可能未做格式校验
  • 尝试非预期输入:在手机号登录框尝试admin等常见用户名
  • 登录成功后,对URL路径中的数字型参数进行遍历测试
  • 弱口令(如123456)配合参数篡改,可能直接获取高权限身份

3. 忘记密码功能

核心思路:不要只盯着登录口,找回密码/重置密码功能往往漏洞更多。

测试重点:

  • 是否需要短信/邮箱验证
  • 验证逻辑是否可以跳过
  • 重置后的新密码是否可以预测
  • 重置接口是否存在参数篡改空间

四、逆向分析技术

1. WMPFDebugger 调试

核心功能:强制开启小程序的F12调试能力,突破微信对开发者工具的封锁。

使用方法:

  1. 使用WMPFDebugger工具注入微信进程
  2. 在小程序中打开目标页面
  3. 按F12呼出开发者工具
  4. 在敏感函数(如getPhoneNumber、login、encryptData)附近设置断点
  5. 触发对应操作时,断点处可获取加密参数、密钥等敏感信息

适用场景:

  • 需要获取前端加密参数的明文值
  • 需要分析前端加密/解密流程
  • 需要定位密钥的生成逻辑

2. 加密接口逆向与自动化

场景描述:小程序中的查询接口使用前端加密传输,无法直接篡改参数。

测试思路:

步骤1:识别加密传输

  • 抓包发现请求体或响应体是加密数据(如Base64字符串、十六进制字符串)
  • 发现数据加密传输时,推断可能存在未授权访问(因为开发者认为"加密了就是安全的")

步骤2:逆向获取加密逻辑

  • 反编译小程序源码
  • 全局搜索加密关键词(encrypt、decrypt、key、iv)
  • 定位加密算法和密钥

步骤3:植入自动化工具

  • 将逆向获取的加密逻辑提取出来
  • 植入Yakit热加载、BurpSuite插件或自定义脚本
  • 实现自动加密/解密,进行批量测试

步骤4:批量爆破

  • 重点关注手机号查询类接口,此类接口常缺乏鉴权
  • 使用自动化工具对加密接口进行批量参数测试

3. VIP/付费限制绕过

核心原则:HTTP响应中看到加密的敏感数据,直接逆向前端代码。

判断逻辑:

  1. 分析业务限制逻辑,判断是"后端控制返回"还是"前端控制解密"
  2. 如果后端已返回完整加密数据,前端仅做权限判断后解密
  3. 反编译获取解密算法和密钥
  4. 直接解密响应包中的加密数据,绕过前端权限限制

常见场景:

  • VIP视频/音频内容加密传输
  • 付费文档/资料的加密响应
  • 会员专属功能的加密数据

五、越权测试

1. ID参数遍历

测试思路:

  • 从正常业务流程的返回数据包中提取记录ID
  • 修改ID参数进行越权查询测试
  • 验证服务端是否校验资源归属

常见可遍历参数:

  • userid、uid、id
  • orderid、order_id
  • articleid、postid

注意:如果参数需要猜测,危害较小,部分平台不收录。有规律的参数(如自增ID)才具有高价值。

2. 水平越权

测试方法:

  • 登录成功后,对URL路径中的数字型参数进行遍历
  • 修改参数值尝试访问其他用户的数据
  • 使用低权限身份跑一遍所有接口,发现未授权访问

3. 短参数爆破

场景描述:小程序中存在短位参数(如邀请码、房间号)。

优化策略:

  • 分析参数位数和字符集
  • 采用"固定部分位数 + 爆破剩余位"的策略
  • 结合业务特征缩小范围

六、凭证泄漏与利用

1. AppID 与 AppSecret 泄漏

泄漏场景:

  • 小程序前端代码中硬编码
  • 配置文件泄漏
  • 反编译后的源码中暴露

危害:

  • 调用微信公众号/小程序官方接口
  • 生成访问Token
  • 调用公众号接口获取敏感信息

2. AccessToken 泄漏

获取途径:

  • 接口响应中直接返回
  • 前端代码中硬编码
  • 日志/调试信息中暴露

利用方式:直接调用小程序/公众号的API接口。

3. OpenID 泄漏

风险点:

  • 某些接口登录后,通过OpenID进行鉴权
  • 同个公司下的不同小程序/公众号可能共用OpenID
  • 泄漏OpenID后可在同公司的其他应用中伪造身份

4. SessionKey 与 IV 泄漏

核心风险:SessionKey和IV是解密前端加密数据的关键参数。如果泄漏,攻击者可以解密用户敏感信息(如手机号、地址)。

泄漏场景:

  • 接口响应中直接返回
  • 前端代码中硬编码
  • 日志信息中暴露

利用方式:

  • 使用解密工具(如wx_sessionkey_decrypt)解密加密数据
  • 修改解密后的用户数据,重新加密发送给服务端

七、前端源码中的信息收集

1. API路径提取

核心方法:SPA/小程序前端Bundle中常打包所有API路径,是天然的"信息收集突破口"。

搜索关键词:

  • type:"POST"、type:"GET"
  • post("、get("
  • url:、url:"、url:'
  • path:、path:"
  • action?

2. 隐藏功能发现

测试方法:

  • 分析前端源码中的条件渲染逻辑(如ng-if="role != 'admin'")
  • 发现隐藏的界面或功能
  • 直接调用对应的后端接口,绕过前端限制

3. 环境配置信息

常见泄漏:

  • 开发/测试/生产环境的API基址
  • 第三方服务的配置信息
  • 调试模式的开关配置

八、工具链

1. 抓包工具

  • Proxifier:强制转发微信进程流量到代理
  • Reqable:现代化抓包工具,对小程序支持友好
  • BurpSuite:核心抓包和重放工具

2. 反编译工具

  • wedecode:https://github.com/biggerstar/wedecode
  • fine:https://github.com/fasnow/fine
  • wxapkg:https://github.com/wux1an/wxapkg
  • UnpackMiniApp:配合PC端微信提取小程序包

3. 调试工具

  • WMPFDebugger:强制开启小程序F12调试
  • 微信开发者工具:官方调试工具
  • 微信官方调试平台:http://mp.weixin.qq.com/debug/

4. 解密工具

  • wx_sessionkey_decrypt:https://github.com/mrknow001/wx_sessionkey_decrypt
  • API-Explorer:https://github.com/mrknow001/API-Explorer

5. 综合工具

  • TscanPlus:内置小程序反编译工具

九、实战心得

1. 小程序是重要的独立攻击面

不要只测试Web端就结束。小程序后端API往往与Web端共用,但安全校验可能完全不同。很多厂商对小程序的安全重视程度低于Web端,正是突破口。

2. 加密不等于安全

前端加密(AES、3DES等)只是保护传输,不验证身份。如果密钥硬编码在前端代码中,加密形同虚设。核心原则:看到加密数据,直接逆向。

3. 手机号验证 ≠ 安全登录

仅通过手机号验证身份是常见的设计缺陷。如果服务端仅校验手机号而不校验请求来源的合法性,攻击者可通过信息泄露获取他人手机号后实现账号接管。

4. 前端限制不可信

前端输入框的限制(如只能输入手机号)、按钮的禁用状态,都不是安全防线。后端必须独立验证所有输入。

5. 双开测试提高效率

同时启动两个微信进程(start WeChat.exe两次),一个登录普通账号,一个登录目标账号,方便进行越权对比测试。

6. 从信息泄露到身份伪造

信息泄露和身份伪造是小程序测试中常见的组合。从非登录功能(如审批领导查询、用户列表)中获取敏感信息,再用于登录接口的身份伪造,是高效的攻击链。

7. 框架知识加速挖掘

熟悉若依、JeecgBoot等常见框架的默认接口路径和行为模式,可快速定位有效API,提高测试效率。


十、结语

微信小程序的安全测试是一个兼具技术深度和业务理解要求的领域。从抓包配置到反编译分析,从登录认证到越权测试,从加密逆向到凭证利用,每一个环节都需要系统化的方法论支撑。本文从小程序与Web测试的差异出发,系统性地介绍了信息收集、登录认证、逆向分析、越权测试和凭证利用的完整方法论,希望能帮助读者建立系统化的小程序渗透测试思维体系。

核心要点回顾

1. 信息收集是基础:

  • 抓包环境配置(Proxifier/Reqable + BurpSuite)
  • 反编译提取API路径和加密密钥
  • 框架识别加速测试

2. 登录认证是突破口:

  • 手机号快捷登录的请求体/响应体篡改
  • 加密数据的逆向解密
  • 忘记密码功能的深度测试

3. 逆向分析是利器:

  • WMPFDebugger强制开启调试
  • 加密接口的逆向与自动化
  • VIP限制的绕过

4. 越权测试要全面:

  • ID参数遍历
  • 低权限身份跑全量接口
  • 短参数爆破优化

5. 凭证泄漏要重视:

  • AppID/AppSecret、AccessToken、OpenID、SessionKey的提取与利用

防御建议

对于防守方来说,小程序的安全防护需要注意:

  1. 服务端独立校验:所有身份认证逻辑在后端完成,不依赖前端传入的身份标识
  2. 加密密钥管理:密钥不硬编码在客户端,使用服务端密钥管理
  3. 接口权限校验:每个API接口都校验用户权限和资源归属
  4. 敏感信息脱敏:响应中不返回敏感凭证信息
  5. 输入严格校验:后端对所有输入参数进行格式、类型、范围校验
  6. 反编译防护:使用代码混淆工具增加反编译难度

更多推荐