PostsMapsLinks
Security

天御滑块验证码逆向

腾讯天御 TCaptcha 滑块验证码的协议取证、缺口识别与求解工程结构

概述

天御(TCaptcha)是腾讯云的行为式验证码产品,2024 年 11 月升级到 2.0:SDK 深度重建,弃用 iframe 模板 改 JS 引擎渲染,并新增"一次一密"防 CaptchaAppid 盗用。版本判据是前端脚本地址:TJCaptcha.js 为 2.0, TCaptcha.js 为旧版,两版可并存切换、后端无需改动。

滑块求解的完整链路是三段式协议:cap_union_prehandle 初始化会话(JSONP,下发会话凭证 sess、工作量证明 配置 pow_cfg、数据采集脚本 tdc 的按会话地址,以及声明式场景图 dyn_show_info);cap_union_new_getcapbysig 按 img_index 取控件皮肤图(682×620 RGBA,含拼图剪影)与背景图(672×390,被抠掉一块);cap_union_new_verify 提交答案换取 ticket 与 randstr,collect、eks、sess 三体单次有效,重放必拒。

工程上可把全部复杂度拆成五个正交问题:视觉(缺口在哪,同会话剪影做形状先验的掩膜模板匹配,无先验边缘 检测在船桅、枝干这类纹理背景上会给出完全错位或零候选的结果);身份(服务端校验 UA 在 HTTP 头、 navigator.userAgent 与 prehandle 的 base64 参数三通道自洽,设备指纹与行为密文由混淆的 tdc 采集脚本生成); 行为(服务端检验的是拼图块终点位置而非拖拽轨迹形态,实测线性位移即可通过);纪律(低频、请求间隔、 请求台账、见风控信号即熔断且已产出结果不回滚);证据(台账、逐次结果行与会话 trace 三层落档,凭证单次 有效不可复用)。

生态里有三条平行路线:纯 HTTP 加 jsdom 桥接执行官方采集脚本(免浏览器、单机高并发);手撕 JSVMP 还原 加密字段(成本以周计且随版本失效);真浏览器上下文算参数加 Node 发请求(绕开补环境,适合取证型复现)。 一次复现实现中实测:剪影掩膜法在真实样本上 P95 误差 2.36px,而无先验 Canny 对照给出 190px 或零候选; 服务端对终点坐标的容差大于 7px。缺口真值的人工标注同样会出错:凸舌方向会变的形状族上,目检 bbox 中心 曾把 408 判成 420,12px 的标注偏差足以把正确算法判成错误算法,真值需要独立第二通道交叉验证。

边界:仅面向官方演示环境做安全研究,禁批量调用、禁对外提供绕过服务、禁用于真实业务站点。

见:攻克腾讯 TCaptcha 滑块验证码:纯 HTTP 协议逆向实战

机制陷阱

verify 提交体的 tlg 是 collect 的长度,不是滑动耗时

多篇转述把 cap_union_new_verify 表单里的 tlg 写成滑动总耗时(毫秒)。实测不是:tlg 恒等于 collect 字符串的长度,是服务端对密文的一致性校验位。判据在于 collect 的长度由轨迹采样点数决定,与滑动耗时要 恰好数值相等几乎不可能;一份可运行的实现把 tlg === String(collect.length) 写成解析层断言,另有独立 实现同样按长度装配并通过验证。按耗时装配该字段会立刻被内容校验拒绝,而错误码(50,内容拒)不会指出 具体是哪个字段错了。

见:记录一下,腾讯滑块 collect 参数,补环境

场景图声明画布、真实图像与 DOM 容器的三个尺寸互不相等

prehandle 场景图声明背景画布 size_2d 为 672×480,实际下发的背景图是 672×390,DOM 背景容器高度按 480 换算(约 235.7px)而图像区只有约 191.5px,三个数字同时存在且都不是笔误。任何"按容器高度反推图像 y 坐标"的写法都会引入约 90 像素域的系统性偏差。同时答案 ans 走显示域(约 330px 宽)、缺口识别走图像域 (672px 宽),把 672 域的缺口坐标直接填进答案,误差随 x 线性放大(x 约 425 处偏约 217px)。换算比约 0.4911,但必须运行时从 DOM 读,写死常量会在窗口尺寸或设备像素比变化时全错。

见:攻克腾讯 TCaptcha 滑块验证码:纯 HTTP 协议逆向实战

Copyright © 2024 Lionad - CC-BY-NC-CD-4.0