第 106 章 Bot Protection 绕过(Cloudflare / Akamai / Kasada / 验证码)
现代网站用 Bot Protection(机器人防护)拦截自动化访问:Cloudflare、Akamai、Kasada、DataDome、HUMAN(PerimeterX)、验证码(reCAPTCHA/hCaptcha/Turnstile)。这是"前端逆向 + 浏览器自动化 + 指纹对抗"的综合战场——也是 2025-2026 年 SRC 与安全研究中最高频的障碍。本章讲清各类防护的原理与分层绕过方法论。
📍 知识点地图 | 主题:Bot Protection 绕过 | 前置:第13/93/105章 | 后续:— | 核心概念:防护六维、四路线、CDP、TLS指纹、验证码
106.1 先懂敌人:Bot Protection 在检测什么
防护检测的 6 个维度:
1. JS 环境指纹(浏览器特征: canvas/WebGL/字体/UA/时区/语言)
2. TLS/网络指纹(JA3/JA4: TLS 握手特征暴露自动化库)
3. 行为分析(鼠标轨迹/点击节奏/滚动/时间间隔)
4. 浏览器自动化检测(webdriver/DevTools/CDP 特征)
5. IP 信誉(数据中心 IP/代理/历史攻击记录)
6. 挑战令牌(JS 生成的加密 token,服务端验证上下文一致性)
核心认知: 现代防护不是"单点检测",是"多维打分"
→ 绕过也不是"一个技巧",是"让整体分数低到不触发"
106.2 主流平台防护特点(先认平台)
Cloudflare(最常见)
层级:
1. 基础 Bot Fight Mode(IP+UA 简单检测)
2. Turnstile(无感验证码,JS 挑战)
3. Managed Challenge(交互式验证码)
4. WAF 层(第 96 章 WAF 绕过配合)
特点:
□ 全球 CDN,几乎每个站点都有(绕 CF = 必备技能)
□ Turnstile 无感模式最难(无人工交互)
□ 挑战令牌: cf_clearance cookie(成功挑战后发放,有时效)
Akamai
特点:
□ 企业级防护(银行/电商/大厂)
□ 传感器脚本(akamai sensor data)收集大量指纹
□ 动态混淆传感器(每次加载都变)
□ 分数制: 高信誉用户低分放行,低分触发验证
难点: 传感器动态混淆 → 静态逆向失效 → 需要运行时采样
Kasada(最强硬之一)
特点:
□ 全程加密挑战(整个防护 JS 都混淆+加密)
□ 多阶段 challenge(每步都有解)
□ 服务端绑定上下文(token 与 TLS/时间/随机数强绑定)
□ 主动防御(检测到绕过立即升级)
难点: 纯静态逆向基本不可能 → 必须运行时方案
DataDome / HUMAN(PerimeterX)
DataDome:
□ 高精度行为分析(鼠标/键盘/滚动模式)
□ 响应速度快(实时拦截)
HUMAN(PerimeterX):
□ 传感器采集 + 行为分析
□ 历史著名的 px-cookie 挑战链
验证码(reCAPTCHA / hCaptcha / Turnstile)
分类:
□ 无感(invisible/enterprise): 后台判定,无交互 → 最像"评分"
□ 交互式: 点选/滑块/旋转/拼图
□ 验证码≠Bot Protection: 常作为"附加层"叠加在防护之上
本质: 验证码判定的是"是不是人" → 绕过 = 让服务端认为"是人"
106.3 绕过路线总览(先选路线再动手)
路线 A: 真实浏览器 + 人工/半自动(最稳,成功率最高)
场景: 单次/低频/高价值操作
方法: Playwright/Selenium 驱动真实浏览器,人操作关键步骤
特点: 指纹真实、行为真实 → 基本不触发
路线 B: 浏览器自动化 + 反检测插件(中等)
场景: 中频自动化
方法: Playwright + stealth 插件(隐藏自动化特征)+ 真实指纹
特点: 成功率取决于目标强度(弱防护够用,Kasada 不够)
路线 C: 运行时补环境 + Node 复现(逆向路线)
场景: 需要程序化生成 token(API 调用)
方法: 第 13 章方法——浏览器采样 token 生成逻辑 → Node 补环境复现
特点: 最难但最"干净"(无浏览器依赖);强混淆平台难
路线 D: 指纹伪造(TLS/JS 层)
场景: 配合 A/B/C 使用(不是独立路线)
方法: JA3 伪装(curl-impersonate)、UA/Canvas/WebGL 伪造
特点: 消除"自动化特征",提升其他路线的成功率
106.4 路线 A:真实浏览器方案(先试这个)
为什么最稳: 防护的终极目标"识别自动化",真实浏览器 = 无自动化特征
实现(Playwright 驱动真实 Chrome):
1. 用 playwright 启动本机 Chrome(不是内置 Chromium)
executable_path = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
2. 保持真实用户数据目录(真实指纹/登录态)
user_data_dir = "C:\\Users\\xxx\\AppData\\Local\\Google\\Chrome\\User Data"
3. 打开页面 → 正常浏览
4. 需要交互的操作(拖滑块/点选)→ 人做 or CDP 原生事件
CDP 原生事件(第 105 章案例 1 已实战验证):
Input.dispatchMouseEvent 发送原生鼠标事件
→ 与 WebDriver 无关(绕过自动化检测)
# Playwright + 本机 Chrome + 真实指纹(路线 A 骨架)
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
executable_path="C:/Program Files/Google/Chrome/Application/chrome.exe",
headless=False, # 有头(无头是检测信号)
args=["--disable-blink-features=AutomationControlled"],
)
ctx = browser.new_context(
user_agent="Mozilla/5.0 ...(真实 UA)",
viewport={"width": 1920, "height": 1080},
locale="zh-CN",
timezone_id="Asia/Shanghai",
)
page = ctx.new_page()
page.goto("https://target.com")
# 人/或 CDP 完成关键交互
input("完成验证后按回车...") # 半自动:人处理验证码
106.5 路线 B:自动化 + 反检测(提升成功率)
原理: 消除"自动化特征"(webdriver/DevTools 痕迹)
常见自动化特征与消除:
□ navigator.webdriver === true → stealth 插件处理
□ Chrome DevTools 协议痕迹(CDP 监听)→ 运行时删除
□ 自动化 UA(HeadlessChrome)→ 伪造真实 UA
□ canvas/webgl/字体指纹异常 → 伪装(部分平台会测)
□ 无头模式特征 → 用有头 or 优化无头
工具:
playwright-stealth(Python/JS 插件)
puppeteer-extra-plugin-stealth(Node)
注意: stealth 只是"消除已知特征",新检测仍可能发现
106.6 路线 C:运行时采样 + 补环境(逆向路线)
场景: 需要"程序化生成 token"(不走浏览器)—— API 直接调用
流程(第 13 章五阶段的 bot 版):
1. Observe: 浏览器里触发挑战 → 记录生成的 token
2. Capture: 找到生成 token 的 JS 函数(XHR 断点/搜索特征)
3. Rebuild: 提取算法 → Node 补环境(window/document/navigator...)
4. Patch: 按报错逐项补环境(第 13 章 env-patching)
5. 验证: 生成的 token 被服务端接受
瓶颈:
□ 强混淆平台(Kasada/Akamai 动态混淆)→ 静态提取极难
□ 上下文绑定(token 与 TLS/时间/随机数绑定)→ 光有算法不够
→ 强平台用路线 A/B 兜底
106.7 路线 D:指纹伪造(辅助技能)
# TLS 指纹伪造(JA3/JA4)—— curl 被识别为"自动化"的元凶
# curl-impersonate: 伪装成真实浏览器 TLS 指纹
curl-impersonate-chrome https://target.com
# 或 Python: tls-client(支持 JA3 配置)
# 原理: TLS 握手特征(cipher 顺序/扩展)与浏览器一致
# UA/头完整伪造(最小操作)
# 但: 现代防护更看重 JA3/JS 指纹,单改 UA 不够
106.8 验证码专项(在 Bot Protection 之上)
原则: 先绕过 Bot Protection(拿 cf_clearance 等)再处理验证码
(验证码往往是"分数不够时"的追加挑战)
各类型思路:
滑块(拖拽):
□ 半自动: CDP 原生拖拽(案例 1 已验证,成功率最高)
□ 全自动: 分析缺口位置 → 计算轨迹 → 原生事件模拟
轨迹要像人(加速-减速-抖动),直线匀速=检测信号
点选(选出猫/红绿灯):
□ 图片识别(OCR/目标检测)定位元素 → 点击
□ 人工辅助(半自动)最稳
旋转/拼图:
□ 图像处理找缺口 → 计算旋转/位移 → 拖拽
reCAPTCHA v2/v3 / hCaptcha / Turnstile:
□ 无感型(v3/Turnstile): 核心是"评分"→ 行为+指纹真实是关键
□ 交互型: 结合上面思路
关键: 行为轨迹真实度 > 解法正确度
(答对了但轨迹像机器 = 还是被标记)
106.9 完整绕过流程(决策树)
目标站点有 Bot Protection
├─ 低频/单次 → 路线 A(真实浏览器+人)→ 成功
├─ 中频自动化 → 路线 B(stealth)→ 不行降级 A
├─ 需要 token → 路线 C(采样+补环境)
│ ├─ 弱混淆 → 成功(生成 token)
│ └─ 强混淆(Kasada/Akamai)→ 回退 A/B
├─ 全程配合路线 D(TLS 伪装)
└─ 有验证码 → 先绕防护再处理验证码(106.8)
106.10 检查清单
□ 平台识别(CF/Akamai/Kasada/DataDome/验证码)
□ 检测维度评估(指纹/TLS/行为/自动化/IP)
□ 路线选型(A/B/C/D 组合)
□ 真实指纹准备(本机 Chrome/真实 UA/时区)
□ 自动化特征消除(stealth/CDP)
□ TLS 伪装(curl-impersonate)
□ 行为真实度(轨迹/节奏/间隔)
□ 验证码处理(原生事件优先)
□ token 验证(服务端接受)
□ 记录: 成功率/触发情况(报告素材)
106.11 伦理与边界(重要)
□ 本章技术用于: 授权测试、SRC 范围内、安全研究
□ Bot Protection 绕过可能违反目标服务条款
→ 只在明确授权的目标上测试
□ 不用于: 攻击性抓取/滥用/绕过付费墙
□ 注意: 部分防护对"绕过尝试"有法律条款(先读规则)
动手练习
- 对一个有 Cloudflare 的测试目标,用路线 A(本机 Chrome + 半自动)完成一次访问。
- 用 curl-impersonate 对比 curl 的 TLS 指纹差异(抓取 JA3 对比)。
- 在一个滑块验证码靶场(网上有练习站),用 CDP 原生事件完成拖拽。
- 分析一个 Turnstile 页面:识别它的挑战流程与 token 生成点。
深入阅读
- 本教材:第 13 章(JS 逆向五阶段)/ 第 93 章(浏览器自动化)/ 第 105 章(CDP 实战案例)
- 本教材:第 102 章(转发头/路由——部分防护的旁路思路)
- 外部: curl-impersonate、playwright-stealth、各平台安全文档