如何绕过烦人的 hCaptcha & Cloudflare Captcha

由于 Google 决定对 reCAPTCHA Enterprise 服务开始收费,所以 Cloudflare 决定换到一个不那么贵的验证码服务 hCaptcha。然而不幸的是,hCaptcha 并不能 Cloudflare 的期望,不仅对用户很不友好,而且还有严重的产品设计问题,以至于你可以不费吹灰之力,就能绕过它。

TL; DR

对于普通人来说,你只要看这一段就行了。

请注意,本文完成于 2020 年 4 月 10 日,hCaptcha 随时可能更新他们的使用政策,文中提到的方法随时都会可能失效!

1. 注册 hCaptcha 无障碍服务账号

点击 这个链接 进行注册。

hcaptcha-register.png

不一定要用真实的邮箱,能收到邮件的临时邮箱就行;国家和地区根据你常用的 IP 进行选择就好了。点击「Submit」开始注册。

2. 去邮箱收件

去你的邮箱获取 hCaptcha 发来的邮件,这幅邮件应该长这样:

hcaptcha-email.png

保存好这封邮件,这个按钮以后还用得到的。你也可以直接复制这个按钮的链接、将其添加到你的浏览器书签中。

需要注意的是大部分邮箱都会使用跳转页面和追踪链接,所以你要确保复制的是 hCaptcha 的链接,它应该长这样:

https://accounts.hcaptcha.com/verify_email/xxxxxxxx-xxxx-x4xx-xxxx-xxxxxxxxxxxx

accounts.hcaptcha.com/verify_email/ 打头,结尾是一串 v4 的 UUID)。

点击按钮将会跳转到 hCaptcha 的设置页面:

hcaptcha-set-cookie

点击「Set Cookie」按钮,等按钮下方出现一行字「Cookie set.」时就大功告成了!

hcaptcha-cookie-set.png

现在你可以测试一下是不是生效了:试试访问 这个链接,当出现 hCaptcha 时,直接点击「I am human」左边的方框,是不是不用再选图片、直接就通过了?

hcaptcha-sukkaw

是的,就这么简单!

当然,hCaptcha 的 Cookie 有效期只有 12 小时。还记得我之前说的么,把 hCaptcha 发给你的链接添加到书签!


如果你只是一个想在 hCaptcha 上省点事的人,那么你现在可以关掉这个页面了。

如果你点开这篇文章是为了学习如何干坏事的话,那么你来对地方了,接着读下去吧。

hCaptcha 的链接

还记得上文说过么,hCaptcha 通过邮件发送的链接的格式是这样的:

https://accounts.hcaptcha.com/verify_email/[v4 uuid]

邮件中的 URL 将会跳转到「Set Cookie」页面,那么随机生成的 UUID 呢?

const { v4: uuidv4 } = require("uuid");
console.log('https://accounts.hcaptcha.com/verify_email/' + uuidv4());

// "https://accounts.hcaptcha.com/verify_email/3cb9faea-2e45-4cb4-a4e1-d532ce53504e"

尝试访问以后跳转到的是 hCaptcha 面板的登陆页面,看来随机 UUID 是行不通的。

试试看 curl 会得到什么结果:

$ curl -v https://accounts.hcaptcha.com/verify_email/[redacted]

...
< HTTP/1.1 302 FOUND
...
< Set-Cookie: __cfduid=[redacted]
< Set-Cookie: INGRESSCOOKIE=[redacted]
< Set-Cookie: hmt_id=[redacted]
< Set-Cookie: session=[redacted]
< Location: https://dashboard.hcaptcha.com/welcome_accessibility
...

$ curl -v https://accounts.hcaptcha.com/verify_email/3cb9faea-2e45-4cb4-a4e1-d532ce53504e

...
< HTTP/1.1 302 FOUND
...
< Set-Cookie: __cfduid=[redacted]
< Set-Cookie: INGRESSCOOKIE=[redacted]
< Set-Cookie: hmt_id=[redacted]
< Location: https://dashboard.hcaptcha.com/login
...

所以,只有正确的 UUID 才能得到 session 这个 Cookie。值得注意的是,session 这个 Cookie 没有过期日期,即浏览器关闭以后这个 Cookie 就会被删除。

打开我们的好伙伴——浏览器的开发者工具,并切换到 Network Tab,访问 hCaptcha 的获取 Cookie 页面。

可以注意到,点击「Set Cookie」会触发一个 GET https://accounts.hcaptcha.com/accessibility/get_cookie

fead0000da9c763ee1d6

fe4f0001434dbdf29c27

啊哈!只需要一个带 session Cookie 的 GET 请求,我们就直接拿到了 hc_accessibility 这个 Cookie,有效域是 .hcaptcha.com ,有效期是 12 小时。

对,你没有想错。不论是获取 session 还是 hc_accessibility,全程只需要 curl 就可以完成!

Cloudflare Captcha

Cloudflare 的 Captcha 页面基本是依赖 JS 实现。首先 Cloudflare Captcha 页面会加载一段 JS:

https://site.at.cloudflare.example.com/cdn-cgi/scripts/hcaptcha.challenge.js

当 Solve Captcha 以后,Cloudflare 的这个 JS 会产生一个 POST 请求:

POST ?__cf_chl_captcha_tk__=GENERATED_TOKEN

GENERATED_TOKEN 根据 Captcha 的返回值和 inline 在 Captcha 页面的 ID 计算得到,其中 POST 的数据类型是 formdata,包括如下字段:

  • r:用于统计的信息,经过加盐和 encode
  • cf_captcha_kind:Captcha 类型,hCaptcha 是 h
  • h-recaptcha-response:hCaptcha 的返回值
  • g-recaptcha-response:之前是 reCAPTCHA 的返回值,现在和 h-recaptcha-response 相同,应该是作为 reCAPTCHA 的向前兼容

Cloudflare 会给这个 POST 请求返回原始请求的内容,同时传递一个 cf_clearance Cookie(有效期 24 小时),这个 Cookie 在接下来的 1000 个请求中都有效(Cloudflare 也会根据站长的设置在一定时间内要求访客再次进行验证)。

Cloudflare 对于使用 cf_clearance 的请求有如下几点要求:

  • cf_clearance 本身依然有效
  • User-Agent 要一致
  • IP 要在同一个 C 段内(不要求同一个 IP)

只要满足上述三个需求,就可以使用 cf_clearance 通过 Cloudflare 了。

本文作者 : Sukka
本文采用 CC BY-NC-SA 4.0 许可协议。转载和引用时请注意遵守协议、注明出处!
本文链接 : https://blog.skk.moe/post/bypass-hcaptcha/

喜欢这篇文章?为什么不考虑打赏一下作者呢?

评论加载中 ...