极验3代 加密分析

news2025/3/2 14:49:14
  • 目标链接
'aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9zbGlkZS1mbG9hdC5odG1s'
  • 接口分析
  1. 极验参数重要信息 gt和challenge;gt是固定的,但是challenge每次请求会产生不同的,这里的请求的并没有什么加密参数。
    在这里插入图片描述

  2. 下一个请求 gettype.php,传递了 gt 参数的值以及 callback,callback 为 geetest_ + 时间戳;响应预览中返回了一些 js 文件及对应的版本号。
    在这里插入图片描述

  3. get.php?xxx,传入的参数如下:
    gt:register-slide 响应返回的 gt 值;
    challenge:register-slide 响应返回的 challenge 值;
    w:对轨迹、滑动时间等进行加密后的参数,不存在轨迹直接置空
    callback:geetest_ + 时间戳。
    在这里插入图片描述响应数据好像也没啥,就是极验的帮助中心信息

  4. 点击按钮进行验证之后,Network 中抓包到了以下信息 ajax.php?xxx请求
    gt:register-slide 响应返回的 gt 值;
    challenge:register-slide 响应返回的 challenge 值;
    w:对轨迹、滑动时间等进行加密后的参数, w 值也可以直接置空;
    callback:geetest_ + 时间戳。
    在这里插入图片描述
    响应返回验证码模式,滑块验证码为 slide,点选验证码为 click

  5. 第二个 get.php?xxx,url 中传递了一些参数
    gt:register-slide 响应返回的 gt 值;
    challenge:register-slide 响应返回的 challenge 值;
    callback:geetest_ + 时间戳。
    type:上个请求返回的验证码类型
    在这里插入图片描述重点响应参数:
    bg:被打乱的带缺口背景图,需要还原
    fullbg:被打乱的完整背景图,需要还原
    slice:滑块图片,不需要还原
    c:关键参数,与后面 aa 参数的值有关,固定值;
    s:关键参数,与后面 aa 参数的值有关。

  6. 接下来请求ajax.php?xxx
    t:register-slide 响应返回的 gt 值;
    challenge:register-slide 响应返回的 challenge 值 + 两位字符串,注意多了两位,是第二个 get.php?xxx 返回值中得到的;
    w:对轨迹、滑动时间等进行加密后的参数,需要通过逆向得到;
    callback:geetest_ + 时间戳。在这里插入图片描述

  • 参数分析
    需要分析的参数challenge+两位数、w参数

w参数:

  1. w 参数在 js 文件中有特征码,点击按钮进行验证之后,ctrl + shift + f 全局搜索 “\u0077”,因为 \u0077 就是 w 的 Unicode 编码,然后点击进入 slide.7.8.9.js 文件中,7.8.9 为当前版本。
    在这里插入图片描述

  2. 进入后点击左下角 {} 大括号,格式化文件,再 ctrl + f 局部搜索 “\u0077”,只有一个结果,在第 6086 行,在第 6088 行打下断点,滑动滑块即会断住,h + u 即为 w 参数的值
    在这里插入图片描述

  3. 参数是 h 和 u 相加得到的,所以找到定义的位置,看看是怎么构造生成的

var u = r[$_CAIAt(754)]()
l = V[$_CAIAt(353)](gt[$_CAIAt(218)](o), r[$_CAIAt(756)]())
h = m[$_CAIAt(782)](l)
"\u0077": h + u

可以看到,h 参数是传入了 l 参数后经过 m[$_CAIAt(782)] 方法处理后得到的

  1. u参数
    1. u 参数通过 r[$_CAIAt(754)] 方法生成,选中后跟进到方法定义位置
    在这里插入图片描述
    2. 进入函数在 6227 行 return 处打下断点,重新拖动滑块,即会断住
    在这里插入图片描述
    加密地方

    e = new U()[$_CBGAZ(353)](this[$_CBGAZ(756)](!0));
    //还原
    e = new U()["encrypt"](this["$_CCEc"](!0));
    
    1. his[“$_CCEc”] 分析完了,那 new U()[“encrypt”] 是什么呢,选中 new U() 后,从原型链中可以看到 setPublic,根据经验很有可能就是 RSA 加密设置公钥
      在这里插入图片描述

    2. 第 2908 行,ut 函数传入了两个值,t 为公钥值,e 为公钥模数,都是固定值:
      t:“00C1E3934D1614465B33053E7F48EE4EC87B14B95EF88947713D25EECBFF7E74C7977D02DC1D9451F79DD5D1C10C29ACB6A9B4D6FB7D0A0279B6719E1772565F09AF627715919221AEF91899CAE08C0D686D748B20A3603BE2318CA6BC2B59706592A9219D0BF05C9F65023A21D2330807252AE0066D59CEEFA5F2748EA80BAB81”
      e:“10001”
      这里可以直接引库复现,也可以选择将算法部分扣下来,局部搜索 var U = function,在第 2043 行,将整个自执行函数扣下来,这里随机数后期写成固定值,后面也有随机数,不然会造成传参不匹配

    3. 剩下就一点点扣

  2. 参数l

    1. u 参数解决后,接着需要分析 l 参数,内容如下:
    // 混淆
    l = V[$_CAIAt(353)](gt[$_CAIAt(218)](o), r[$_CAIAt(756)]());
    // 未混淆
    l = V["encrypt"](gt["stringify"](o), r["$_CCEc"]());
    

    l 参数的结果是将 gt.“stringify”(o)'和 r.“ C C E c " ( ) 加密后得到的,先来分析 r . " _CCEc"() 加密后得到的,先来分析 r." CCEc"()加密后得到的,先来分析r."_CCEc”() , r"$_CCEc"()还是16位字符串。(记得得干rsa同一个值

    1. 将这里写成跟之前一样的固定值, gt[“stringify”](o) 返回的是 JSON 格式的数据,由 o 参数生成
      在这里插入图片描述
      userresponse:滑动距离 + challenge 的值;
      passtime:滑块滑动时间;
      imgload:图片加载时间;
      aa:轨迹加密;
      ep-tm:window[“performance”][“timing”] 相关;
      mocq:每天 key、value 会变,后文分析;
      rp:gt + 32 位 challenge + passtime,再经过 MD5 加密。

    2. 键值进行分析,先来分析下 userresponse,o 定义在第 6012 行:
      在这里插入图片描述

    	o = {
        'lang': i[$_CAIAt(116)] || $_CAHJd(103),
        'userresponse': H(t, i[$_CAHJd(182)]),
        'passtime': n,
        'imgload': r[$_CAIAt(750)],
        'aa': e,
        'ep': r[$_CAHJd(714)]()
    };
    
    1. userresponse 定义在第 6014 行,需要分析 H(t, i[$_CAHJd(182)]),控制台打印一下
      在这里插入图片描述
      见通过整个H函数扣下来补环境。

    2. passtime需要跟轨迹的最后一个时间一样

    3. 接着分析aa 其定义在第 6017 行,值由参数 e 传递,同样向上跟栈到 $_CGlj 中,为第 8168 行的 l 值,l 定义在第 8167 行,三个参数加密后得到:
      在这里插入图片描述

      n[ D A A A V ( 913 ) ] [ _DAAAV(913)][ DAAAV(913)][_CJJJb(1066)]() :轨迹加密后的结果;
      n[ D A A A V ( 69 ) ] [ _DAAAV(69)][ DAAAV(69)][_CJJJb(1097)] :c 值,在第二个 get.php?xxx 返回的响应中得到;
      n[ D A A A V ( 69 ) ] [ _DAAAV(69)][ DAAAV(69)][_CJJJb(319)] :s 值,在第二个 get.php?xxx 返回的响应中得到。
      这里相当于就是得把轨迹进行加密,将其算法全扣下来。细节就是它加密了两次。
      轨迹值:在这里插入图片描述

    4. ep 定义在第 6018 行,跟进到 r/[ C A H J d ( 714 ) ] 中, t m 参数定义在第 6239 行 ! [ 在这里插入图片描述 ] ( h t t p s : / / i m g − b l o g . c s d n i m g . c n / b e 90376 d f 73 c 4 b 3 c 91 e 86 f 15195 c f b a 8. p n g ) 跟进 n e w b t ( ) [ _CAHJd(714)] 中,tm 参数定义在第 6239 行 ![在这里插入图片描述](https://img-blog.csdnimg.cn/be90376df73c4b3c91e86f15195cfba8.png) 跟进 new bt()[ CAHJd(714)]中,tm参数定义在第6239![在这里插入图片描述](https://imgblog.csdnimg.cn/be90376df73c4b3c91e86f15195cfba8.png)跟进newbt()[_CBGEC(760)] 中,在第 5268 行打下断点,tm 结果如下
      在这里插入图片描述
      再把this$_BJBFK(666)补上即可

    5. 往下看可以发现o新增了两个参数的,接下来分析 rp 参数,定义在第 6076 行
      在这里插入图片描述

    	o[$_CAIAt(791)] = X(i[$_CAIAt(104)] + i[$_CAIAt(182)][$_CAHJd(139)](0, 32) + o[$_CAHJd(704)]);
    	o["rp"] = X(i['gt'] + i['challenge']['slice'](0, 32) + o['passtime']);
    

    经过验证X就是MD5,而且是没有魔改的

    1. 接下来每次请求会变的那个参数
      在这里插入图片描述
      接着往下找,第 6026 行 a = window[$_CAHJd(744)](s) 执行之后 s 中生成了以上的键值对,所以跟进到 window[$_CAHJd(744)] 中,会跳转到 gct.xxxxxxxx.js 文件中,这个文件的路径可以从 get.php 接口获取到
      在这里插入图片描述
      在该文件的第 1253 行打下断点,可以看到此时的 t 中已经生成了 h9s9: “1803797734” :
  3. 参数 o 复现完毕,回到第 6078 行,分析完 V[$_CAIAt(353)] l 即完成,跟进,定义在第 3218 行,在第 3230 行打下断点,这里为 AES 加密,初始向量 iv 值为 “0000000000000000”:
    在这里插入图片描述

function V(o_text, random_str) {
    var key = CryptoJS.enc.Utf8.parse(random_str);
    var iv = CryptoJS.enc.Utf8.parse("0000000000000000");
    var srcs = CryptoJS.enc.Utf8.parse(o_text);
    var encrypted = CryptoJS.AES.encrypt(srcs, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    for (var r = encrypted, o = r.ciphertext.words, i = r.ciphertext.sigBytes, s = [], a = 0; a < i; a++) {
        var c = o[a >>> 2] >>> 24 - a % 4 * 8 & 255;
        s.push(c);
    }
    return s;
};

对比结果一致

  1. 参数分析完毕,终于只剩下一个 h 了,m$_CAIAt(782) 即将 l 加密后得到的,跟进 m[$_CAIAt(782)],定义在第 1568 行,在第 1575 行打下断点,为 e 中两个 value 值相加:
    在这里插入图片描述
    e 定义在第 1574 行,t 为传入的 l 参数,跟进到 this[$_GFJn(264)] 中,在第 1523 行,直接扣下来至此w参数复现完成。

现在已经将h和u还原成功了。

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

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

相关文章

365天深度学习训练营-第J2周:ResNet50V2算法实战与解析

目录 一、前言 二、论文解读 1、ResNetV2结构与ResNet结构对比 2、关于残差结构的不同尝试 3、关于激活的尝试 三、模型复现 1.Residual Block 3、ResNet50V2架构复现 4.ResNet50V2模型结构大图 一、前言 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习…

自动定时播报股价变动(零代码):今天我的股票涨了吗?

你是否会关注某个上市公司每天的股价信息吗&#xff1f;比如自己公司~你是否需要一个机器人&#xff0c;每天在内部群自动播报今日收盘价&#xff1f;不用复制粘贴&#xff0c;也不用写python&#xff0c;今天教你一个零代码可以自动播报股价数据的好办法。来看看我自动化的效果…

从开始测试到年薪40W,我的自动化测试艰辛历程

我希望我的故事能够激励现在的软件测试人&#xff0c;尤其是还坚持在做“点点点”的测试人。 你可能会有疑问&#xff1a;“我也能做到这一点的可能性有多大&#xff1f;”因此&#xff0c;我会尽量把自己做决定和思考的过程讲得更具体一些&#xff0c;并尽量体现更多细节。 …

嵌入式ARM设计编程(四) ARM启动过程控制

文章和代码已归档至【Github仓库&#xff1a;hardware-tutorial】&#xff0c;需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。 一、实验目的 &#xff08;1&#xff09; 掌握建立基本完整的ARM 工程&#xff0c;包含启动代码&#xff0c;C语言程序等&…

如何选择好的IB课程学校?

在上海除了拼中考&#xff0c;你还可以走一条更有“选择权”的路——国际化学校&#xff01; 然而选择学校时&#xff0c;让家长最头痛的事情&#xff0c;莫过于为孩子选择什么样的国际化课程。 今天我们来聊聊IB课程&#xff01; 三大主流国际课程中&#xff0c;被公认含金量最…

操作系统引论

操作系统是管理硬件和软件的一种应用程序。操作系统是运行在计算机上最重要的一种软件&#xff0c;它管理计算机的资源和进程以及所有的硬件和软件。它为计算机硬件和软件提供了一种中间层&#xff0c;使应用软件和硬件进行分离&#xff0c;让我们无需关注硬件的实现&#xff0…

嵌入式C语言设计模式 --- 外观模式

1 - 什么是外观模式? 外观模式(Facade Pattern),是一种比较简单的结构型模式,它存在的目的,也是为了简单。 外观模式隐藏了一系列接口的复杂性,旨在为外部客户端提供一个更高层次且统一简单的接口,简化了客户端调用某些模块的一系列操作。 外观模式应该是软件工程师…

Git入门使用详细笔记小白教程

Git入门使用详细笔记小白教程 一、克隆远程仓库到本地 1.复制远程仓库的地址到URL中&#xff1a; 二、本地和远程冲突 注意事项&#xff1a; 一定要在第二次修改提交到本地之前先pull远程的项目&#xff01;&#xff01;&#xff01;不然就会本地和远程的项目起冲突。 冲突…

Selection bias mitigation in recommender system using uninteresting items学习笔记

0 简介 论文题目&#xff1a;Selection bias mitigation in recommender system using uninteresting items based on temporal visibility 发表情况&#xff1a;2023年&#xff0c;Expert Systems With Applications 论文地址&#xff1a;https://doi.org/10.1016/j.eswa.202…

Java_Maven:5. 把第三方 jar 包放入本地仓库或私服

目录 1 导入本地库 2 导入私服 3 参数说明 1 导入本地库 随便找一个 jar 包测试&#xff0c;可以先 CMD进入到 jar 包所在位置&#xff0c;运行 mvn install:install-file -DgroupIdcom.alibaba -DartifactIdfastjson -Dversion1.1.37-Dfile fastjson-1.1.37.jar -Dpackaging…

基于matlab使用深度学习的SAR目标分类

一、前言此示例演示如何创建和训练一个简单的卷积神经网络&#xff0c;以使用深度学习对 SAR 目标进行分类。深度学习是一种强大的技术&#xff0c;可用于训练健壮的分类器。它已经在从图像分析到自然语言处理的不同领域显示出其有效性。这些发展对SAR数据分析和SAR技术具有巨大…

YOLOv5简介

YOLOv5 一、输入端 1. Mosaic数据增强&#xff1a; CutMix 数据增强&#xff1a;随机生成一个裁剪框Box&#xff0c;裁剪掉A图中的相应位置&#xff0c;然后用B图相应位置的ROI放到A中被裁剪的区域中形成新的样本。采用加权求和的方式计算损失&#xff0c;将A区域中被cut掉的…

Kubernetes安全

Kubernetes RBAC授权 Kubernetes 安全框架 K8S安全控制框架主要由下面3个阶段进行控制&#xff0c;每一个阶段都支持插件方式&#xff0c;通过API Server配置来启用插件。1. Authentication&#xff08;鉴权&#xff09; K8s Apiserver提供三种客户端身份认证&#xff1a;• H…

JVM08执行引擎

执行引擎属于JVM的下层 执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念&#xff0c;这两种机器都有代码执行能力&#xff0c;其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的&#xff0c;而虚拟机的执行引擎则…

JavaWeb5-线程常用属性

目录 1.ID 2.名称 3.状态 4.优先级 5.是否守护线程 5.1.线程类型&#xff1a; ①用户线程&#xff08;main线程默认是用户线程&#xff09; ②守护线程&#xff08;后台/系统线程&#xff09; 5.2.守护线程作用 5.3.守护线程应用 5.4.守护线程使用 ①在用户线程&am…

基础篇(-1)-java特点、JDK、JRE、JVM区别、字节码编译、跨平台、程序运行

文章目录1.Java的特点有哪些&#xff1f;2.JDK和JRE和JVM的区别3.Java为什么采用字节码编译&#xff1f;4.什么是跨平台&#xff1f;5.Java程序从源代码到运行需要三步&#xff1f;1.Java的特点有哪些&#xff1f; Java是一种编程语言&#xff0c;被特意设计用于互联网的分布式…

windwos安装spring-cloud-alibaba-nacos

windwos安装spring-cloud-alibaba-nacos前言一、预备环境二、下载源码或者安装包1.启动2.关闭总结前言 这个快速开始手册是帮忙您快速在您的电脑上&#xff0c;下载、安装并使用 Nacos。 一、预备环境 Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos&#x…

[ vulhub漏洞复现篇 ] Drupal Core 8 PECL YAML 反序列化任意代码执行漏洞(CVE-2017-6920)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Django框架进阶版

一、Django介绍 1.起源 2005年发布&#xff0c;采用python语言编写的。 早期Django主要做新闻和内容管理 重量级python web框架&#xff0c;配备了大量组件 2.组件 包含组件如下 基本配置文件/路由系统 MTV设计模式 Cookies和Session 分页和发邮件 Admin管理后台 3…

2023美赛A题完整数据!思路代码数据数学建模

选取内蒙古河套灌区&#xff08;典型干旱区&#xff09;2010-2020年气温&#xff0c;降雨&#xff0c;蒸散发和水汽压月数据 包括四种主要作物及其占比 内容截图如下&#xff1a; 链接为&#xff1a;https://www.jdmm.cc/file/2708703 同时还提供参考代码和参考文章的选项~…