极验4参数分析

news2025/1/17 5:54:16

目标链接

'aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v'

接口分析

  1. 开发者人员工具进行抓包,刷新页面,抓到了一个名为 load?captcha_id=xxx 的包,Query String Parameters 包含了一些参数
    在这里插入图片描述
    captcha_id:验证码 id,固定值,由 adaptive-captcha-demo.js 文件生成,后文分析;
    challenge:动态变化,由 gtc4.js 文件生成,后文分析;
    client_type:表示 web 端;
    risk_type:验证码类型,例如滑块为 slide,无感为 ai;
    lang:语言;
    callback:geetest_ + 时间戳。
    注意这里可以发现参数challenge已经不是像2代、3代那样通过接口生成了,而是相当于一个uuid的生成;同时底图也没做拆分
    在这里插入图片描述
    bg:背景图片地址;
    captcha_type:验证码类型;
    gct_path:gct4 文件路径;
    lot_number:后续生成 pow_msg、w 的关键参数;
    payload:后续 verify 请求接口需要的参数;
    datetime:后续生成 pow_msg 的关键参数;
    process_token:后续 verify 请求接口需要的参数;
    slice:滑块图片地址。

  2. 点击按钮开始验证,弹出滑块验证码,滑动滑块,抓包到 verify?captcha_id=xxx,Query String Parameters 同样包含了一些参数:

captcha_id:与 load 接口请求头中的 captcha_id 一致;
client_type:表示 web 端;
lot_number:load 接口返回的;
risk_type:与 load 接口中的一致,表示验证码类型;
payload:load 接口返回的;
process_token:load 接口返回的;
w:加密参数,由轨迹、滑动时间、滑动距离、userresponse、device_id、pow_msg 等参数加密得到;
callback:geetest_ + 时间戳,主要作用是防止缓存。
在这里插入图片描述
响应预览中返回的内容如下,result 值为 fail 即校验失败,success 为校验通过,通过后携带 seccode 下的参数进行后续业务请求:
在这里插入图片描述

参数分析

  • captcha_id参数
  1. 全局搜索 captcha_id,跟进到 gt4.js 文件中
    在这里插入图片描述

  2. 进去后在第 307 行打上断点,刷新页面即会断住,此时 captcha_id 参数的值已经生成,同时 challenge 参数定义在下一行
    在这里插入图片描述

  3. 向上跟栈到 value,即 adaptive-captcha-demo.js 文件中,会发现其是个固定值
    在这里插入图片描述

  • challenge参数
  1. 前面提到,challenge 参数定义在 captcha_id 参数的下一行,在 gt4.js 文件的第 309 行打下断点:
    在这里插入图片描述

  2. 可以看到,challenge 参数的值由 uuid 函数生成,扣出即可

var uuid = function () {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        var r = Math.random() * 16 | 0;
        var v = c === 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });
};

console.log(uuid())
  • w参数
  1. 找加密接口可以通过跟3代验证码那种方式找到或者跟栈。
    在这里插入图片描述

  2. e 也是跟三代类似的参数,r 是将 i 参数和转为字符串的 e 参数加密得到的
    在这里插入图片描述

ar r = (0,d[$_CBHHs(15)])(JSON.stringify(e), i)
  1. 向上跟栈,找到 e 参数中各部分定义生成的位置,跟到 $BHIH 中, 中先生成了四个键值对
    在这里插入图片描述

passtime 和 track 是熟悉的滑动时间和轨迹,setLeft 为识别出来的缺口距离,userresponse 定义在 19593 行, a 为 setLeft 参数的值,t[$_GDFCG(1909)] 为定值 1.0059466666666665:

var _ = {
    "setLeft": a,
    "track": c,
    "passtime": s,
    'userresponse': a / 1.0059347482096355 + 2
};
  1. 接着跟到 $_BCFj 中,e 定义在第 6201 行,下面几行定义了 e 中的 device_id、lot_number、pow_msg、pow_sign:
    在这里插入图片描述
    device_id 同一个网站是固定值,lot_number 是 load 响应返回的,控制台打印一下 pow_msg(看过请求参数都知道这些是请求参数里面的)、pow_sign 的结果:
    在这里插入图片描述
var _ = {
    "setLeft": a,
    "track": c,
    "passtime": s,
    'userresponse': a / 1.0059347482096355 + 2,
    'device_id': i['deviceId'],
    'lot_number': i['lotNumber'],
    'pow_msg': n['options']['powMsg'],
    'pow_sign': n['options']['powSign']
};
  1. pow_msg 很明显是由几部分组成的,pow_sign 经过加密,向上跟栈到 init 中,分别定义在第 5837 行和第 5838 行,为 d 字典的键,根据键名取值:
    在这里插入图片描述
var c = t['toDataURL']()['replace']('data:image/png;base64,', "")
_ = new w[('default')][('MD5')]()['hex'](c)
a['options']['deviceId'] = _;
var h = a["options"]
    , l = h['powDetail']
    , p = h['lotNumber']
    , f = h['captchaId']

d = v['default'](p, f, l['hashfunc'], l['version'], l['bits'], l['datetime'], "")

进去d执行的函数可以看到结果预计就是执行了这句将传入参数拼接起来
在这里插入图片描述加盐值这里进去可以发现跟极验2 3一样的随机字符串16位
在这里插入图片描述
还原整个加密部分

function get_pow(e, t, n, i, r, s, o) {
    // let pow_msg = i + "|" + r + "|" + n + "|" + s + "|" + t + "|" + e + "|" + o + "|"
    let pow_msg = "1|0|md5|2023-01-17T16:10:27.042878+08:00|54088bb07d2df3c46b79f80300b0abbe|9ddbfcbf25f846c3a47f89603050a9b0||"
    // let h = getRandomStr()
    let h = 'e699e453328fb1a0'
    let l = pow_msg + h
    p = X(l)
    return {
        'pow_msg': pow_msg + h,
        'pow_sign': p
    };

}
  1. 还差一部分未分析完
    在这里插入图片描述
    em 等定值就不分析了,注意 kqg5:“1557244628”,这个参数值和三代滑块中一样,每隔几个小时会改变,向上跟栈到 $_BCFj 中,在第 6207 行打下断点,此时 e 中这个值还未生成:
    在这里插入图片描述

下一行打下断点,下步断点,即执行完 n[ C B H I E ( 791 ) ] ( e ) ; 后,这个参数值就生成了,证明是 n [ _CBHIE(791)](e); 后,这个参数值就生成了,证明是 n[ CBHIE(791)](e);后,这个参数值就生成了,证明是n[_CBHIE(791)] 方法生成的,跟进去:

在这里插入图片描述

跳转到第 5766 行,在第 5779 行打下断点,此时的 n 中还未生成此参数:
在这里插入图片描述
执行了 _gct(n) 后即生成:
在这里插入图片描述
可见其生成位置在 _gct 方法中,跟进去后到 gct4.js 文件,和三代大差不差:
在这里插入图片描述
终于把入参分析完了

  1. 可以将值导出,至此 e 就分析完了,接着回到r,跟进到加密函数 d[$_CBHHO(84)] 中,定义在第 11772 行
    在这里插入图片描述

d[$_DIEIG(198)])© + u; 即 r 参数的值,c 为一个大数组,u 明显也经过加密了,所以 r 参数的值就是数组 c 加密后再加上 u 得到的:
在这里插入图片描述

  1. 现在又到了分析c和u的时候了
    先跟进到 u,其定义在第 11705 行,解混淆后如下
i = d[$_DIEHH(178)](),
u = new l[($_DIEHH(15))]()['encrypt'](i)

i 是随机数,跟进到加密函数 l[($_DIEHS(84))] 中,在第 12725 行,于 12741 行打下断点,可以看到这里就是个 RSA 加密,扣代码或者直接引库即可,我是直接把里面的自执行直接全扣然后new出来的

u = new r()['encrypt'](i)

回到 c 参数,c 参数的值为一个大数组,其定义在第 11705 行,解混淆后内容如下:

var c = s[a]["symmetrical"]["encrypt"](e, i);

e 之前分析完了,i 为随机数,两个参数已经分析完了,跟进到加密方法中,在第 12174 行,于 12186 行打下断点,控制台打印一下混淆部分内容,很熟悉的东西,这里就是 AES 加密,iv 为初始向量,加密模式为 CBC
在这里插入图片描述
最后c再经过了一层加密
在这里插入图片描述

在这里插入图片描述
总结:
整个扣跟3代大同小异
只是存在入参不同
混淆程度不通

备注:本文仅供学习,有问题可以找博主共同进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/378769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用AzureGraph通过Microsoft Graph收集Azure活动目录信息

关于AzureGraph AzureGraph是一款针对Azure活动目录的信息收集工具,该工具基于Microsoft Graph实现其功能。多亏了Microsoft Graph技术,AzureGraph才能从Azure活动目录获取各种信息,如用户、设备、应用程序、域等。 此应用程序允许我们通过…

一次性搞定 `SHOW SLAVE STATUS` 的解读

一次性搞定 SHOW SLAVE STATUS 的解读 解析日志文件的位置 诚然, GTID(全局事务标识符)已经在 MySQL 5.6中得到支持, 此外,还可以通过 Tungsten replicator 软件来实现(2009年以后一直有谷歌在维护,不是吗?)。 但有一部分人还在使用MySQL 5.5的标准副本方式, 那么这些二进制日…

20道经典自动化测试面试题

概述 觉得自动化测试很难? 是的,它确实不简单。但是学会它,工资高啊! 担心面试的时候被问到自动化测试? 嗯,你担心的没错!确实会被经常问到! 现在应聘软件测试工程师的岗位&…

前端经典react面试题及答案

为什么 React 元素有一个 $$typeof 属性 目的是为了防止 XSS 攻击。因为 Synbol 无法被序列化,所以 React 可以通过有没有 $$typeof 属性来断出当前的 element 对象是从数据库来的还是自己生成的。 如果没有 $$typeof 这个属性,react 会拒绝处理该元素。…

docker搭建redis集群模式

目录docker 安装redis1.创建redis.conf开启redis验证(开启密码)允许redis外地连接后台启动开启redis持久化2.启动redis容器3.进入容器redis集群3主3从1.新建6个redis容器2.构建主从关系3.查询集群信息4.主从扩容5.主从缩容docker 安装redis 1.创建redis.conf 开启redis验证(开…

第四阶段-12关于Spring Security框架,RBAC,密码加密原则

关于csmall-passport项目 此项目主要用于实现“管理员”账号的后台管理功能,主要实现: 管理员登录添加管理员删除管理员显示管理员列表启用 / 禁用管理员 关于RBAC RBAC:Role-Based Access Control,基于角色的访问控制 在涉及…

Feign Ribbon Hystrix 三者关系

在微服务架构的应用中, Feign、Hystrix,Ribbon 三者都是必不可少的,可以说已经成为铁三角。 Feign 介绍 Feign 是一款Java语言编写的 HttpClient 绑定器,在 Spring Cloud 微服务中用于实现微服务之间的声明式调用。Feign 可以定…

IIC子系统

文章目录引言一、I2C 总线驱动框架二、I2C驱动框图(重点)三、I2C 子系统软件框架3.1 I2C子系统的4个关键结构体3.2 I2C总线与平台总线的结合3.3 在设备树信息添加i2c从设备3.4 新增加i2c从设备四、i2c driver驱动的编写4.1 陀螺仪和加速度工作原理4.2 mpu6050的寄存器信息和设置…

Synchronized的锁升级过程

Synchronized的锁升级过程 synchronized锁升级过程:在synchronized中引入了偏向锁、轻量级锁、重量级锁之后,当前具体使用的是synchronzed中的那种类型锁,是根据线程竞争激烈程度来决定的。 偏向锁:在锁对象的对象头中记录一下当…

中间件之Kafka实用篇

目录标题一、一些定义(一)设计kafka的初衷(二)消息的持久化(三)sendfile 技术(零拷贝)二、获取kafka三、卡夫卡客户端工具四、kafka核心API(功能)五、spring …

阶段十:总结专题(第三章:虚拟机篇)

阶段十:总结专题(第三章:虚拟机篇)Day-第三章:虚拟机篇1. JVM 内存结构2. JVM 内存参数3. JVM 垃圾回收4. 内存溢出5. 类加载6. 四种引用7. finalizeDay-第三章:虚拟机篇 1. JVM 内存结构 要求 掌握 JVM…

Spring Cloud Alibaba全家桶(三)——微服务负载均衡器Ribbon与LoadBalancer

前言 本文为 微服务负载均衡器Ribbon与LoadBalancer 相关知识,下边将对什么是Ribbon(包括:客户端的负载均衡、服务端的负载均衡、常见负载均衡算法),Nacos使用Ribbon,Ribbon内核原理(包括&#…

Qt::QOpenGLWidget 渲染天空壳

在qt窗口中嵌入opengl渲染天空壳和各种立方体一 学前知识天空壳的渲染学前小知识1 立方体贴图 天空壳的渲染就是利用立方体贴图来实现渲染流程2 基础光照 光照模型3 opengl帧缓冲 如何自定义帧缓冲实现后期特效4 glsl常见的shader内置函数 glsl编程常用的内置函数二 shader代码…

部署运行ai智障写作记录【ChatRWKV】

文章目录前言一、环境安装1.python环境:Python 3.10。2.安装一些 pip 库numpy 、tokenizers 、prompt_toolkit3.安装pytorch 1.13.1CUDA 11.7二、运行记录1、下载代码2、下载训练参数3、编辑代码运行总结前言 看到知乎一篇教程, 大佬自己弄得ai小说续写…

AI环境搭建步骤(Windows环境)

1. 安装好Anaconda3版本(1) 安装链接:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?CM&OD本文使用Anaconda3下载链接:Anaconda5(2) 注意安装anaconda时一定要把环境变量加入windows环境中。要没有勾选,安装完后还有手动加入…

线性代数学习-2

线性代数学习-2矩阵消元消元回代消元矩阵置换矩阵逆矩阵本文转载于https://herosunly.blog.csdn.net/article/details/88713747 该文章本人认为十分有用,便自己敲一遍笔记加固印象原文链接 原文这个笔记感觉比我老师讲的更加透彻,清晰。很好的展示了线性…

车辆热管理测试方案

车辆热管理是在能源危机出现、汽车排放法规日益严格以及人们对汽车舒适性要求更高的背景下应运而生的。将各个系统或部件如冷却系统、润滑系统和空调系统等集成一个有效的热管理系统;控制和优化车辆的热量传递过程,保证各关键部件和系统安全高效运行&…

《C++ Primer Plus》(第6版)第5章编程练习

《C Primer Plus》(第6版)第5章编程练习《C Primer Plus》(第6版)第5章编程练习1. 计算闭区间内的整数和2. 重新编写程序清单5.43. 累加4. 投资价值5. 销售情况6. 销售情况27. 汽车8. 统计单词数量9. 统计单词数量210. 嵌套循环《…

(五十)大白话深入研究索引之前,先来看看磁盘数据页的存储结构

前面我们已经给大家把MySQL数据库的部分内核原理,更新语句的执行原理,事务原理以及锁原理,都初步的讲给大家听了,同时还穿插了一些相关的数据库性能优化的案例,相信现在大家已经对数据库执行增删改语句的原理有了较为深…

小程序容器与微服务架构:提高应用程序开发效率和部署速度的利器

随着移动互联网的发展,小程序已经成为了一种非常流行的应用方式,它可以在不安装任何应用的情况下,直接在移动终端设备(如:App,iPad等)中运行。微服务架构则是一种的分布式系统架构,可…