在做渗透项目的时候经常会遇到小程序,抓上包之后其实和Web端渗透基本一致。但小程序有一些特有的漏洞,本篇文章来简单盘点记录一下。
0x01.反编译
用工具即可,现在我一般喜欢把反编译后的源码丢给AI先过一遍。
0x02.抓包
我一般不用手机来抓,习惯使用电脑端微信开小程序,然后配合Proxifier来抓包。需要注意在公司的情况,可能会存在公司的VPN代理,这样会和Proxifier配置的代理打架,导致抓包软件类似Yakit根本无法完成抓包,所以我在公司一般就在虚拟机里面搞。

0x03.JavaScript逆向
一般稍微难搞的小程序都有请求头的类似X-Sign头的JavaScript加密。类似之前遇到一个小程序前端加密相当复杂,各种JS混淆、各种加密算法、各种不同情况的转变,不过在AI时代这一切都将化为虚有,推荐这个MCP: https://github.com/zhizhuodemao/js-reverse-mcp ,配合Agent进行JavaScript逆向。
算法逆向出来后,同样丢给AI写一下Mitmproxy脚本,然后开两个Yakit,一个来修改请求包(配置下游代理到proxy),MITM脚本负责修改Signature(在配置上游代理),另一个Yakit负责抓MITM发的包(Web Fuzzer方便观察响应)。具体可以参考: https://cdipper.github.io/posts/2026-07-08-Console-Hook%E6%9F%A5%E7%9C%8Bbody%E6%98%8E%E6%96%87%E5%9C%A8%E8%BF%9B%E8%A1%8Csign%E5%8A%A0%E5%AF%86%E5%88%86%E6%9E%90/ 。
0x04.session_key伪造任意用户登陆
对于小程序我们都知道有一个“手机号快捷登录”,此漏洞就发生在这里。

整个过程为如下,首先是wx.login换取了一个临时code,后端服务器向微信接口服务发起请求,用code换取openid和session_key(会话密钥)。

当小程序需要获取用户的快捷手机号时,微信前端会返回加密数据:encryptedData(加密的手机号等信息)和 iv(加密偏移量)。解密这些敏感数据,必须使用该用户当前会话的session_key。session_key始终不在微信前端的,encrytedData是由微信服务器通过session_key加密返回到前端的。如果攻击者在抓包时拿到了session_key,就可以在本地逆向篡改手机号并重新加密,或者直接欺骗后端登录接口,实现任意用户登录。如下案例请求包中泄漏了sessionKey和iv。

可以使用此项目中的脚本: https://github.com/mrknow001/wx_sessionkey_decrypt 来加解密sessionKey,替换encryptedData造成任意用户登陆。

0x05.AppId / AppSecret泄漏获取access_token接管小程序
这三个字段解释如下:
- AppId:小程序的唯一标识符,用于区分不同小程序应用;
- AppSecret:小程序密钥,配合AppID调用微信开放平台服务端接口时用于身份校验,等同账号体系中的“密码”;
- access_token:小程序全局唯一后台接口调用凭据,调用绝大多数服务端接口(如发送订阅消息、生成小程序码、获取用户手机号)时必传;
其中access_token是一个短期凭证(2h)可以利用前两个字段(长期凭证)请求 https://api.weixin.qq.com/cgi-bin/token 获取。
如下是我在测试过程中发现某小程序在登陆时有一个请求access_token的接口。

获取后具体利用方式可以参考微信官方文档,其中描述了一系列API。

如下我利用这个access_token调用获取微信官方回调服务器的IP地址。
