本文内容仅限于学术研究和技术讨论,实际应用中应严格遵守相关法律法规和服务条款。本文内容遵守CC BY-NC-ND 4.0协议,禁止任何修改后二次传播。
一、什么是hcaptcha
hCaptcha 是一种 验证码系统,全称是 “human Captcha”,由美国公司 Intuition Machines 开发的人机验证服务,广泛用于防止恶意程序(bot)滥用网站资源,比如自动注册账号、刷票、暴力破解等。
二、识别hcaptcha
1、当浏览器的Network中包含 https://newassets.xxx.xxx/xxx/hcaptcha.html 文档接口, https://xxx.xxx.com/api.js?onload=hCaptchaOnLoad&render=explicit 代表该网站部署了hcaptcha服务, 触发的情况各不相同,取决于网站开发者绑定到哪个元素中。
2、从控制台中输入hcaptcha , 如果该对象存在 则代表该网站启动了hcp ,如果需要定位到具体位置, 可以根据 /api.js?onload=xxx 中的xxx去定位hcaptcha 执行的位置。
三、接口分析
hcaptcha 是由 /api/js?onload=xxx 启动, 加载完毕之后会进入回调函数 xxx 执行代码, 首先会加载hcaptcha.html, 然后会发送一个 https://api.xxx.com/checksiteconfig?xx=xxx 请求 获取当前网站 sitkey 的 挑战信息, req是一个jwt格式, 其中第二段中的信息包含 执行加密的js url 以及当前验证的data
加密的js 通常为 https://newassets.hcaptcha.com/c/挑战信息解析出来的hex值/hsw.js 当hsw生成的n失败 会请求一个新的 https://newassets.hcaptcha.com/c/挑战信息解析出来的hex值/hsj.js
hsw.js 中是wasm 进行加密, hsj.js 是采用js结构的asm 进行加密(本篇文章讲hsw.js)
验证接口通常为 https://api.hcaptcha.com/getcaptcha/网站sitkey 负载通常为 buffer形式(可以手动修改成json格式) 响应通常也是 buffer 形式

下列是修改成json形式的负载, n值跟motionData就是我们需要的参数(motionData是轨迹以及JSON.stringify(navigator)得到的值)

当响应中有 generated_pass_UUID 字段 代表验证通过, 提交该字段的值就可以验证是否有效 ,expiration 字段代表 generated_pass_UUID 有效期,c中的type也就是js的类型 xxx/hsw.js、 xxx/hsj.js

四、参数分析
前面提到了hsw.js , 咱们直接进到hsw.js, 里面只有一个自执行函数 , 该自执行函数返回了一个函数,并且内部有 WebAssembly.instantiate(dr, DJ).then 的字样


既然是返回一个函数, 咱们直接在 return wo(JSON.stringify(rg), tZ, de) 打上断点, 然后刷新页面, 从下图可以看到 hsw 进行了初始化

往上跟栈可以看到 Le.script(e + “/” + n + “.js”, {integrity: i}).then 内部进行初始化

第二次可以看到dr参数为checksiteconfig 获取的req 参数

继续跟栈可以看到 new Promise 生成了一个异步, cG 是一个 ƒ () { [native code] } 其实整个异步返回的是 Pd.Jb(dr, DJ, de, FB) , 也就是说这个就是需要的 参数n

跟进到 Pd.Jb 函数中, 可以看到 ir(dr, yC.Fb, yC.vb); 将dr写入到wasm内存中,然后 Dv(cG) 初始化 js与wasm交互的数组

如图所示, lZ 为 交互数组, 进行补环境的时候可以在该数组赋值的时候进行日志断点

插桩之后可以看到所有的赋值操作,也可以看到取到了哪些环境


可以看到最终的n值也在这进行了输出

根据这个位置的日志 可以采用补环境方式去完成(该产品点太多了, 以后会补充)
五、结果



文章有(1)条网友点评
哪来的标题党