如何绕过烦人的 hCaptcha & Cloudflare Captcha
由于 Google 决定对 reCAPTCHA Enterprise 服务开始收费,所以 Cloudflare 决定换到一个不那么贵的验证码服务 hCaptcha。然而不幸的是,hCaptcha 并不能 Cloudflare 的期望,不仅对用户很不友好,而且还有严重的产品设计问题,以至于你可以不费吹灰之力,就能绕过它。
TL; DR
对于普通人来说,你只要看这一段就行了。
请注意,本文完成于 2020 年 4 月 10 日,hCaptcha 随时可能更新他们的使用政策,文中提到的方法随时都会可能失效!
1. 注册 hCaptcha 无障碍服务账号
点击 这个链接 进行注册。
不一定要用真实的邮箱,能收到邮件的临时邮箱就行;国家和地区根据你常用的 IP 进行选择就好了。点击「Submit」开始注册。
2. 去邮箱收件
去你的邮箱获取 hCaptcha 发来的邮件,这幅邮件应该长这样:
保存好这封邮件,这个按钮以后还用得到的。你也可以直接复制这个按钮的链接、将其添加到你的浏览器书签中。
需要注意的是大部分邮箱都会使用跳转页面和追踪链接,所以你要确保复制的是 hCaptcha 的链接,它应该长这样:
https://accounts.hcaptcha.com/verify_email/xxxxxxxx-xxxx-x4xx-xxxx-xxxxxxxxxxxx
(accounts.hcaptcha.com/verify_email/
打头,结尾是一串 v4 的 UUID)。
3. 获取 hCaptcha Cookie
点击按钮将会跳转到 hCaptcha 的设置页面:
点击「Set Cookie」按钮,等按钮下方出现一行字「Cookie set.」时就大功告成了!
现在你可以测试一下是不是生效了:试试访问 这个链接,当出现 hCaptcha 时,直接点击「I am human」左边的方框,是不是不用再选图片、直接就通过了?
是的,就这么简单!
当然,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 就会被删除。
hCaptcha 的获取 Cookie 页面
打开我们的好伙伴——浏览器的开发者工具,并切换到 Network Tab,访问 hCaptcha 的获取 Cookie 页面。
可以注意到,点击「Set Cookie」会触发一个 GET https://accounts.hcaptcha.com/accessibility/get_cookie
:
啊哈!只需要一个带 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 了。