欢迎光临
我们一直在努力

【验证码系列】某讯滑块-加密流程分析

文章目录

  • 某讯滑块-加密流程分析
    • 目标和接口
    • 1. 请求流程分析
      • 1.1. 验证接口
      • 1.2. js接口
      • 1.3. 验证码获取接口
    • 2. 请求参数分析
      • 2.1. 验证码获取接口
      • 2.2. js接口
      • 2.3. 图片缺口识别
      • 2.4. POW 计算
      • 2.5. 验证接口
    • 3. 总结

某讯滑块-加密流程分析

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在主页联系作者立即删除!

目标和接口

**目标:**滑动拼图验证成功 接口:aHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9wcm9kdWN0L2NhcHRjaGE=

1. 请求流程分析

方法: 从验证接口入手,倒推所需参数和所有需要请求的接口 目标: 通过全局搜索,判断参数是需要逆向的值还是前置接口返回值

1.1. 验证接口

接口: cap_union_new_verify 参数:

  • collect:经测试此参数未校验,可固定
  • tlg:collect的长度
  • eks:来自 tdc.js 接口
  • sess:来自 cap_union_prehandle 接口
  • ans:滑动距离+ cap_union_prehandle 接口返回值
  • pow_answer: cap_union_prehandle 接口返回值+求解值
  • pow_calc_time:与 pow_answer 关联的求解值 在这里插入图片描述

1.2. js接口

接口: tdc.js 参数: 接口url来自 cap_union_prehandle 接口返回值,拼接域名可直接请求

1.3. 验证码获取接口

接口: cap_union_prehandle 参数: 此接口参数固定也可请求,其中返回值的前缀与 callback 相同,如果 callback 为空,则返回值中的前缀也为空

2. 请求参数分析

方法和目标: 此处则需要正向分析,保证每一个接口请求成功再请求下一个接口 以下是最终参数生成位置,后面的参数都基于此过程需要的东西去分析 在这里插入图片描述

2.1. 验证码获取接口

请求中部分参数介绍:

参数作用
aid 验证码应用 ID ,与站点关联
ua Base64 后的浏览器 UA
entry_url 业务入口页,当前为云验证码产品页
js 前端 frame 脚本路径
sess 初始为空,服务端返回本次会话的 sess

响应中重点字段:

字段作用
sess 本次验证码会话凭证,最终 verify 必带
data.comm_captcha_cfg.tdc_path 本次需要加载的 TDC 采集脚本路径
data.comm_captcha_cfg.pow_cfg.prefix POW 前缀
data.comm_captcha_cfg.pow_cfg.md5 POW 目标 MD5
data.dyn_show_info.bg_elem_cfg.img_url 背景图路径
data.dyn_show_info.sprite_url 滑块图路径
data.dyn_show_info.fg_elem_list 前景元素配置,包含滑块裁剪坐标、尺寸、初始位置

其中:

sprite_pos: 滑块在 sprite 图上的裁剪起点
size_2d: 滑块裁剪宽高
init_pos: 滑块初始展示位置

后续识别缺口和提交答案都依赖这些字段。

2.2. js接口

eks 和 collect 是当前项目里最关键的加密/风控参数。

eks 可以直接使用正则表达式提取,或者如页面一样使用补环境方式提取:

eks = re.findall("window\\..*?'(.*?)'", tdc_js)[0]

在这里插入图片描述 collect 经测试是可以固定的,这与站点有关,官网示例并未校验此参数,或者如页面一样使用补环境方式提取:

collect = "tMUf/k3HOl1Z/idr4pb84nZb…"
return eks, collect

在这里插入图片描述

Node 伪浏览器环境方案: 其中 eks 仅需简单补环境就可出值,而 collect 则需要补充完整 dom 环境,包括 canvas、webgl等

// 补环境
require("./env.js")
// tdc.js
require("./tdc.js")
// 与截图位置一致的初始化过程
window.TDC.setData({
"ft": "qf_7Pf__H"
})
// 取值
const eks = window.TDC.getInfo().info
const collect = window.TDC.getData(true)

当前风险点很明确: collect 我当前使用的是硬编码样本,这种写法只能针对未检验次参数的站点使用。因为 collect 理论上与本次TDC 脚本、环境指纹、轨迹和时间状态有关。

2.3. 图片缺口识别

这里我就不过多分析,也是参考其他人的经验做的,可以去搜下,很多分析这里的文章:

流程如下:

1. 下载背景图 bg_url
2. 下载 sprite 图 sprite_url
3. 根据 sprite_pos 和 size_2d 从 sprite 图中裁出滑块模板
4. 对背景图做 pyrMeanShiftFiltering 降噪
5. 对背景图和滑块模板做 Canny 边缘检测
6. 使用 cv2.matchTemplate 做模板匹配
7. 返回匹配位置 max_loc,即背景图缺口坐标

2.4. POW 计算

此部分解决参数 pow_answer、pow_calc_time ,cap_union_prehandle 接口返回:

pow_cfg.prefix
pow_cfg.md5

本地通过暴力枚举 prefix 与 nonce 拼接,当md5拼接值等于目标值时返回拼接值与耗时

if hashlib.md5(f"{challenge_prefix}{pow_ans}".encode()).hexdigest() == target_md5:
return pow_ans, cost_ms

最终提交:

"pow_answer": f"{pow_prefix}{pow_ans}",
"pow_calc_time": str(pow_time)

对应源码位置: 在这里插入图片描述 在这里插入图片描述

2.5. 验证接口

提交表单:

参数来源说明
collect TDC getData(true) 加密采集数据(此站点可用固定值)
tlg len(collect) collect 长度
eks TDC getInfo() TDC 信息
sess prehandle 返回 会话凭证
ans 本地识别结果 滑块答案
pow_answer 本地 POW prefix + pow_ans
pow_calc_time 本地 POW 计算耗时

ans 的结构:

[
{
"elem_id": 1,
"type": "DynAnswerType_POS",
"data": "x,y"
}
]

其中 x 来自 OpenCV 识别出的缺口横坐标加偏移(偏移值由实际识别结果经验总结),y 来自 prehandle 返回的滑块初始 Y 坐标。如果errorCode为50,则识别的距离不对。

3. 总结

当前最应该补强的是动态 collect 生成,但因此站点并未校验所以没有深究。使用当前的固定值或者补环境其实都是不完善的值,因为当前的补环境值仅有850左右的长度,而源网站是1600左右,原因是没有加入轨迹,如果路过大佬有 检验此值的站点 可以联系我研究学习。

关键参数: v: luobidamidi001

以下是运行效果演示: 在这里插入图片描述


感谢关注【遇事不決洛必達】!欢迎点赞收藏和交流指正,我会持续分享我的学习经验和心得。

赞(0)
未经允许不得转载:171主机测评 » 【验证码系列】某讯滑块-加密流程分析
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址