微信小程序任意手机号登录漏洞分析
1. 漏洞背景
在微信小程序的安全测试中,开发者经常遇到一种高危漏洞:任意用户登录(Arbitrary User Login)。这种漏洞通常出现在'微信快捷登录'功能中。攻击者可以通过截获请求包,利用返回的敏感信息解密并修改用户数据,从而伪装成任意用户进行登录。
该漏洞的核心在于小程序后端逻辑对客户端传入数据的信任度过高,且未能有效验证会话密钥(sessionKey)的归属权。
2. 原理分析
2.1 SessionKey 的作用
当用户使用微信授权登录小程序时,微信服务器会返回一个 sessionKey。这个密钥用于加密和解码用户的敏感信息(如手机号、OpenID 等),以保护用户隐私。
官方机制流程如下:
- 前端调用
wx.login获取临时登录凭证code。 - 前端将
code发送给后端服务器。 - 后端用
code换取openid和session_key。 - 前端使用
session_key配合iv和encryptedData进行 AES 解密,获取用户信息。
问题点: 在某些实现不当的小程序中,sessionKey 并没有严格限制在后端服务器内部流转,而是被直接返回给了前端,或者在请求/响应包中以明文形式暴露。一旦攻击者获取了 sessionKey,就可以解密任何由该密钥加密的数据包。
2.2 加密机制
微信提供的用户信息加密方式通常为 AES-CBC。主要参数包括:
encryptedData: 加密后的密文(Base64 编码)。iv: 初始化向量(Base64 编码)。sessionKey: 解密密钥。
如果攻击者能够获取这三个要素,即可通过标准算法解密出原始的用户手机号等信息。
3. 复现步骤
3.1 抓包分析
使用 Burp Suite 等工具拦截小程序的登录请求。重点关注包含 encryptedData 字段的接口。
正常情况下,请求包应包含以下关键参数:
code: 登录凭证。encryptedData: 加密的用户信息。iv: 初始化向量。sessionKey: 注意观察此处是否暴露。
若发现 sessionKey 直接出现在请求体或响应头中,则存在高危风险。
3.2 解密与篡改
- 提取参数:从请求包中复制
encryptedData、iv和sessionKey。 - 解密数据:使用 Python 脚本结合 AES-CBC 算法解密出明文 JSON。
- 修改数据:将明文中的手机号字段修改为攻击者指定的号码。
- 重新加密:使用相同的
sessionKey和iv对修改后的数据进行加密。 - 发送请求:将新的
encryptedData替换原请求包中的值并发送。


