极验3代 加密分析

news/2024/11/8 18:03:45/
  • 目标链接
'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.“CCEc"()加密后得到的,先来分析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[DAAAV(913)][_DAAAV(913)][DAAAV(913)][_CJJJb(1066)]() :轨迹加密后的结果;
      n[DAAAV(69)][_DAAAV(69)][DAAAV(69)][_CJJJb(1097)] :c 值,在第二个 get.php?xxx 返回的响应中得到;
      n[DAAAV(69)][_DAAAV(69)][DAAAV(69)][_CJJJb(319)] :s 值,在第二个 get.php?xxx 返回的响应中得到。
      这里相当于就是得把轨迹进行加密,将其算法全扣下来。细节就是它加密了两次。
      轨迹值:在这里插入图片描述

    4. ep 定义在第 6018 行,跟进到 r/[CAHJd(714)]中,tm参数定义在第6239行![在这里插入图片描述](https://img−blog.csdnimg.cn/be90376df73c4b3c91e86f15195cfba8.png)跟进newbt()[_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.ppmy.cn/news/25708.html

相关文章

element-ui中el-table点击其他自定义按钮展开table中某一行

element-ui中el-table点击其他自定义按钮展开table中某一行 在日常开发中&#xff0c;我们遇见了会有点击某些按钮&#xff0c;使得表格行展开的需求&#xff0c;这时候去查看文档 element-ui&#xff08;table&#xff09; 这里官方提供了示例为在行最左侧有一个展开合并ico…

深入理解MySQLⅢ -- 锁与InnoDB引擎

文章目录锁概述全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁&临键锁InnoDB引擎逻辑存储结构架构内存结构磁盘结构后台线程事务原理redo logundo logMVCC锁 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#x…

MySQL 派生表产生关联索引auto_key0导致SQL非常的慢

相同的SQL在maridb运行0.5秒&#xff0c;在MySQL8.0.26中运行要19秒 官方MySQL在处理子查时&#xff0c;优化器有个优化参数derived_merge&#xff0c;MySQL7开启添加&#xff0c;默认on.很多情况可以自动优化派生表&#xff0c;避免创建临时索引auto_key0和生成临时表数据做…

图文详解Ansible中的变量及加密

文章目录一、变量命名二、变量级别三、.变量设定和使用方式1.在playbook中直接定义变量2.在文件中定义变量3.使用变量4.设定主机变量和清单变量5.目录设定变量6.用命令覆盖变量7.使用数组设定变量8.注册变量9.事实变量10.魔法变量四、JINJA2模板五、 Ansible的加密控制练习1.用…

PPS文件如何转换成PPT?附两种方法

在工作中&#xff0c;PPS文件的使用还是很广泛的&#xff0c;因为作为幻灯片放映文件&#xff0c;点击后就能直接播放&#xff0c;十分方便。但如果想要修改PPS里的内容&#xff0c;PPS是无法编辑的&#xff0c;我们需要把文件转换成PPT&#xff0c;再进行修改。 那PPS文件如何…

数据结构---时间复杂度

专栏&#xff1a;数据结构 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;开学数据结构&#xff0c;接下来会慢慢坑新数据结构的内容&#xff01;&#xff01;&#xff01;&#xff01; 时间复杂度前言1.算法效率1.1如何衡量一个算法的好坏1.2算法的复杂度2.时间复杂度2.1大…

XCP实战系列介绍13-基于Vector_Davinci工具的XCP配置介绍(二)

本文框架 1.概述2. XcpCmdConfig配置2.1 XcpAsychMessage2.2 Calibration 配置2.3 DAQ及STIM配置2.4 XCP切面配置2.5 XCP标准配置3. XcpConfig3.1 XCP Event配置3.2 XCP-Pdu配置4. XcpGeneral1.概述 在上篇我们开始对XCP的配置部分进行介绍,计划分别对通讯部分配置、XCP模块本…

Python3,2分钟掌握Doscoart库,你也能成为艺术家。

2行代码绘制水彩画1、引言2、 代码实战2.1 模块介绍2.2 模块安装2.3 代码示例2.3.1 创建默认图片2.3.2 设置参数创建图片2.3.3 查看设置参数2.3.4 查看配置2.3.5 保存配置2.3.6 加载配置2.3.7 导出配置文件2.3.7 生成Python代码2.3.8 调用文档3、总结1、引言 小屌丝&#xff1…