某验四代滑块

文章详细分析了一个滑块验证码的验证流程,包括load和verify两个接口的请求参数,如captcha_id、w参数的生成过程。w参数涉及到滑动轨迹、时间、距离等信息的加密,以及pow_msg的构建。同时,文章提到了加密方法,如AES,以及错误展示和参数校验的重要性。
摘要由CSDN通过智能技术生成

目录

请求分析

 逆向分析:

captcha_id 参数

 w 参数


网址:

aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v

请求分析

进入网页后,打开开发者人员工具进行抓包,点击滑动拼图验证,此时还未点击按钮开始验证,抓到了一个名为 load?captcha_id=xxx 的包, 包含了一些参数:

  •  captcha_id:验证码 id,固定值,由 adaptive-captcha-demo.js 文件生成,后文分析;
  • challenge:动态变化,由 gtc4.js 文件生成,后文分析;
  • client_type:表示 web 端;
  • risk_type:验证码类型,例如滑块为 slide,无感为 ai;
  • lang:语言;
  • callback:geetest_ + 时间戳

响应内容

与三代相比响应图片未做混淆

  • bg:背景图片地址;
  • captcha_type:验证码类型;
  • gct_path:gct4 文件路径;
  • lot_number:后续生成 pow_msg、w 的关键参数;
  • payload:后续 verify 请求接口需要的参数;
  • datetime:ISO 8601扩展格式的日期,后续生成 pow_msg 的关键参数;
  • process_token:后续 verify 请求接口需要的参数;
  • slice:滑块图片地址。

点击按钮开始验证,弹出滑块验证码,滑动滑块,抓包到 verify?captcha_id=xxxQuery 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_ + 时间戳

接着就是通过结果

 逆向分析:

captcha_id 参数

全局搜索 captcha_id,跟进js文件

这里可以看到 captcha_id, 以及challenge 生成地方,这个captcha_id其实就是一个固定值,想看一下的话,可以跟栈找到,这里我们就跟进 uudi()  

进来之后就可以看到这个就是 challenge 扣出即可

 

 w 参数

之后就是w 参数,全局搜索 "\u0077" 在6294行

 向上可以看到 r 参数位置 

var r = (0,d[$_CBGHl(19)])(f[$_CBGHl(19)][$_CBGIS(584)](e), s)
 
var r = (0,d["default"])(f["default"]["stringify"](e), s)

就是对 e 和 i 进行加密后得到的,i ,弄过极验三的应该很熟悉 e:

简单分析一下e 

  • setLeft:滑块距离
  • track:轨迹
  • passtime:滑动时间
  • userresponse: setLeft 计算得到,向上跟栈
  • lot_number:load 获取
  • pow_msg:1|0|md5|datetime|device_id|lot_number||随机数
  • pow_sign:pow_msg MD5 加密
  • "zw9o":"1971499260":每天变化,影响不大

向上跟栈,找到 e 参数中各部分定义生成的位置,跟到 $_BHIH 中,u 中先生成了三个键值对:

passtime 滑动时间,setLeft 为识别出来的缺口距离,userresponse 定义在 19593 行, a 为 setLeft 参数的值,t[$_GBBCz(1682)] 为定值 1.0059466666666665:

 

a / t[$_GBBCz(1682)] + 2

向上跟栈,init 中这里是2885行

d 定义在第 5835 行,这部分还原一下就很明显了:

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"], "")

v[$_BJIDl(19)]) 跟进去看看都传入了什么

跟进这个s 函数之后,发现他是通过 | 来拼接

发现他是根据这里拼接

 这里 h 还是熟悉的16位随机字符串,l 是通过 |(竖线) 来链接多个字符串

 _ = s + $_CECDv(103) + r + $_CECDv(103) + n + $_CECCN(103) + i + $_CECDv(103) + t + $_CECDv(103) + e + $_CECCN(103) + o + $_CECCN(103);

_ = '1|0|md5|2023-05-22T09:29:55.735264+08:00|54088bb07d2df3c46b79f80300b0abbe|14680fb43253426fae0e64c1a9fe3cfc||'

_ = i + "|" + r + "|" + n + "|" + s + "|" + t + "|" + e + "|" + o + "|";
  • i:l["version"]
  • r:l["bits"]
  • n:l["hashfunc"]
  • s:l["datetime"]
  • t:f, h["captchaId"]
  • e:p, h["lotNumber"]
  • o:""

还原整个函数

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 pow_msg = i + "|" + r + "|" + n + "|" + s + "|" + t + "|" + e + "|" + o + "|";
    // let h = getRandomStr()
    let h = 'e699e453328fb1a0'
    let l = pow_msg + h
    p = X(l)
    return {
        'pow_msg': pow_msg + h,
        'pow_sign': p
    };

}

下面几行定义了 e 中的 device_idlot_numberpow_msgpow_sign

device_id 同一个网站是固定值,lot_number 是 load 响应返回的lot_number,控制台打印一下 pow_msgpow_sign 的结果:

 em 等定值就不分析了,注意 kqg5:"1557244628",这个参数值和三代滑块中一样,每隔几个小时会改变,向上跟栈到 $_BCFj 中,在第 6207 行打下断点,此时 e 中这个值还未生成:

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

 跳转到第 5766 行,在第 5779 行打下断点,此时的 n 中还未生成此参数:

执行了 _gct(n) 后即生成:

 可见其生成位置在 _gct 方法中,跟进去后到 gct4.js 文件,和三代大差不差:

 可以将值导出,至此 e 就分析完了,接着回到第 6282 行,跟进到加密函数d[$_CBGHl(19)]) 中,定义在第 10940 行,d[$_DGAHG(154)])(c) + u;  即 r 参数的值,c 为一个大数组,u 明显也经过加密了,所以 r 参数的值就是数组 c 加密后再加上 u 得到的

u = new l[($_DGAIA(19))]()[$_DGAHG(1246)](s);
var c = i[a][$_DGAHG(1213)][$_DGAIA(1246)](e, s);

s 为十六位字符串,与上面提到的需要保持一致

跟进 i[a][$_DGAHG(1213)][$_DGAIA(1246)]  发现是AES加密

 后又经过d[$_DGAHG(154)]) 加密,跟进去扣下来即可

错误展示:

其中是参数错误,参数中 callback 值错误

{"status":"error","code":"-50004","msg":"jsonp xss","desc":{"type":"defined error"}}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值