小程序sessionkey泄露漏洞利用
案例介绍
闲来无事,在测试某小程序的时候,发现存在sessionkey泄露漏洞。具体流程如下:
1、打开小程序后,点击【用户一键登录】:
2、burp抓包,发现在请求参数中携带了几个比较敏感的字段,如下所示:
三个敏感参数
- encryptedData
- iv
- session_key
3、参考上篇文章,微信小程序登录流程。知道session_key的作用之一是将小程序前端从微信服务器获取到的encryptedData 解密出来。
服务端获取开放数据
微信会对开放数据做签名和加密处理。开发者后台拿到开放数据后可以对数据进行校验签名和解密,来保证数据不被篡改。
签名校验以及数据加解密涉及用户的会话密钥 session_key。 开发者应该事先通过 wx.login 登录流程获取会话密钥 session_key 并保存在服务器。为了数据不被篡改,开发者不应该把 session_key 传到小程序客户端等服务器外的环境。
加密数据解密算法
接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和 unionId),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据(encryptedData) 进行对称解密。 解密算法如下:
- 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
- 对称解密的目标密文为 Base64_Decode(encryptedData)。
- 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
- 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。
微信官方提供了多种编程语言的示例代码(点击下载)。每种语言类型的接口名字均一致。
Python本地实现
# -*- utf-8 -*- |
这块可以看到解密之后,在明文字符串后面有特殊字符 “\0e”
这主要是因为AES算法填充使用的是PKCS#7,该填充模式的特性如下:
所以,这块填充个了 14字节的 “\x0e”。。。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Muhe's Blog!