逆向工程实战手册 第 106 章

第 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 绕过可能违反目标服务条款
  → 只在明确授权的目标上测试
□ 不用于: 攻击性抓取/滥用/绕过付费墙
□ 注意: 部分防护对"绕过尝试"有法律条款(先读规则)

动手练习

  1. 对一个有 Cloudflare 的测试目标,用路线 A(本机 Chrome + 半自动)完成一次访问。
  2. 用 curl-impersonate 对比 curl 的 TLS 指纹差异(抓取 JA3 对比)。
  3. 在一个滑块验证码靶场(网上有练习站),用 CDP 原生事件完成拖拽。
  4. 分析一个 Turnstile 页面:识别它的挑战流程与 token 生成点。

深入阅读

  • 本教材:第 13 章(JS 逆向五阶段)/ 第 93 章(浏览器自动化)/ 第 105 章(CDP 实战案例)
  • 本教材:第 102 章(转发头/路由——部分防护的旁路思路)
  • 外部: curl-impersonate、playwright-stealth、各平台安全文档