РАЗБОР
Статья
Обход антибот-защиты: детекция и evasion
[ обложка статьи ]
Режим чтения
На редтим-проекте в прошлом квартале Cloudflare отрезал автоматизированную разведку за три запроса. Три. Скрипт на
requests получал 403 ещё до парсинга HTML, а Selenium с дефолтным chromedriver блокировался на этапе рендера - антибот фиксировал navigator.webdriver=true и сбрасывал сессию. Через два дня я собрал стек из tls-client, патченного Chromium с отключёнными CDP-маркерами и пула резидентных прокси - прошёл все слои детекции, и он стабильно держался весь скоуп. Ниже - разбор каждого слоя и конкретные техники обхода антибот-защиты, которые работают на практике.Механизмы детекции ботов: четыре уровня фильтрации
Антибот-системы не блокируют по одному признаку. Они выстраивают конвейер из четырёх уровней - IP-репутация, TLS/HTTP fingerprinting, browser fingerprinting и поведенческий анализ - и агрегируют скоринг по всем слоям. Финальное решение (пропустить, показать CAPTCHA, выдать 403) определяется суммарным trust-скором. По данным Imperva Bad Bot Report, автоматизированный трафик уже приближается к половине всего веба. Антибот работает в режиме "каждый запрос подозрителен по умолчанию", и это не паранойя - это статистика. Подробнее - в нашем материале про пентест веб-приложений.Для пентестера обход антибот-защиты - это не про парсинг. Это recon целевого приложения за WAF на этапе initial access, тестирование аутентификации под нагрузкой, имитация credential stuffing (A07:2021 по OWASP - Identification and Authentication Failures). В ряде кейсов - маскировка C2-трафика под легитимные браузерные сессии. В MITRE ATT&CK смежные техники: External Proxy (T1090.002, Command and Control) и Automate/Avoid CAPTCHA (T1696.001 / T1696.002). T1036.012 (Browser Fingerprint) формально описывает сценарий, когда вредоносный код проверяет окружение жертвы для anti-analysis, а не обход antibot-fingerprinting атакующим - маппинг условный, по общей концепции browser fingerprinting.
TLS fingerprinting JA3 и отпечаток HTTP/2
При HTTPS-соединении TLS-рукопожатие (ClientHello) раскрывает набор шифров, расширения, эллиптические кривые и порядок их перечисления. Из этой комбинации считается JA3-хеш - уникальный идентификатор TLS-клиента.JA4 - формат следующего поколения. Он разделяет отпечаток на компоненты: тип протокола, версия TLS, количество расширений, SNI-флаг и отсортированный список шифров. Именно сортировка - ключевое отличие.
random_tls_extension_order=True работает против JA3-детекции, но JA4-хеш не трогает вообще. Чтобы обойти JA4, нужно воспроизводить точный набор расширений и шифров конкретного браузера, а не только тасовать их порядок.Стандартные HTTP-библиотеки Python (
requests, httpx), Node (axios) и Go (net/http) генерируют JA3-хеши, не совпадающие ни с одним браузером. По данным Zenrows, заявленный Chrome User-Agent в паре с JA3 от Python requests - мгновенное палево на любой из основных антибот-систем. Cloudflare, DataDome и Akamai сравнивают хеш с базой известных профилей: User-Agent говорит Chrome, а TLS-отпечаток говорит "скриптовый клиент" - сессия дропается до бэкенда.Второй сигнал - HTTP/2 fingerprinting. Реальные браузеры отправляют фиксированный набор SETTINGS-фреймов в определённом порядке со специфической структурой WINDOW_UPDATE. HTTP-библиотеки используют другой порядок фреймов. Рассогласование HTTP/2 frame ordering вызывает блокировку на Akamai и Cloudflare даже при корректных заголовках и TLS-профиле. Т.е. можно идеально подделать JA3 - и всё равно спалиться на фреймах.
Fingerprinting браузера: canvas, WebGL и WebDriver detection
После прохождения транспортного уровня антибот запускает клиентский JavaScript для сбора browser fingerprint. Разберём ключевые компоненты.Canvas fingerprinting - рендеринг скрытого текста или графики через Canvas API. Результат зависит от GPU, драйверов, ОС и версии шрифтов, создавая устойчивый хеш. Headless-браузеры часто выдают "чистый" рендер без аппаратных шумов. Парадокс: слишком идеальная картинка - сама по себе маркер бота.
WebGL renderer возвращает строку GPU вроде
ANGLE (NVIDIA GeForce RTX 3070 Direct3D11). Headless-окружения возвращают SwiftShader или Mesa - моментальная метка автоматизации. Если видишь SwiftShader в своём headless - антибот тоже его видит.navigator.webdriver - флаг, который Selenium, Playwright и Puppeteer ставят в true по умолчанию. Проверяется одной строкой JS. По данным Olostep, headless-браузеры также оставляют CDP-артефакты: вызовы Runtime.enable, наличие window.cdc_adoQpoasnfa76pfcZLmcfl_* переменных (chromedriver), модификации прототипов объектов - всё то, что реальная браузерная сессия не генерирует.Audio Context - AudioContext API создаёт отпечаток, специфичный для аудио-устройства. Виртуальные аудио-драйверы в headless-окружениях дают результат, отличающийся от реального железа.
Каждый компонент по отдельности не уникален, но комбинация формирует профиль с высокой энтропией. Антибот-системы проверяют не только наличие каждого параметра, но и согласованность: User-Agent заявляет Windows, а canvas выдаёт рендер macOS - финальный скор падает. Один врущий параметр тянет за собой все остальные.
Поведенческий анализ бота и ML-скоринг
Самый трудоёмкий для обхода уровень. Антибот-системы отслеживают движения мыши (траектория, ускорение, микропаузы), паттерн скроллинга (глубина, рывки), тайминг кликов и навигационную последовательность. Страница, загруженная и немедленно распарсенная без единого движения мыши, получает поведенческий скор на уровне бота. Человек так не делает - и антибот это знает.DataDome использует per-customer ML-модели, обучаемые на трафике конкретного сайта. По данным Zenrows, bypass, сработавший на одном DataDome-защищённом ресурсе, может не сработать на другом с тем же DataDome - модели тренируются на разных baseline. Это неприятный сюрприз, когда думаешь, что "уже разобрался с DataDome". PerimeterX (HUMAN Security) отправляет поведенческую телеметрию через POST-запросы к
/api/v2/collector; реплей этих запросов без реального браузерного исполнения детектируется.Honeypot-ловушки - скрытые ссылки и поля, невидимые пользователю, но обнаруживаемые DOM-парсером - входят в поведенческий слой и часто становятся причиной блокировки при грубом парсинге HTML. Бот кликает по невидимой ссылке - и выдаёт себя с головой.
Идентификация антибот-системы перед обходом
Bypass, работающий на Cloudflare, бесполезен против Kasada. Первый шаг - определить вендора. По данным Scrapfly, это делается по сигнатурам в HTTP-ответе, без попыток обхода.
Заголовки ответа: Cloudflare -
CF-RAY и server: cloudflare; DataDome - X-DataDome-* на 403; Akamai - reference number akamai-grn.Cookies: Cloudflare -
cf_clearance, [I]_cf_bm; DataDome - datadome, _dd_s; PerimeterX - _px3, _pxvid; Akamai - _abck; Kasada - KP_UIDz; Imperva - incap_ses, reese84; AWS WAF - aws-waf-token; F5/Shape - TS[/I]-prefixed cookies.JS-файлы: Cloudflare -
challenge.js; DataDome - tags.js; PerimeterX - px.js; Kasada - ips.js.Быстрая проверка одним запросом:
Python:
import requests
try:
resp = requests.get(url, headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/131.0.0.0"
}, timeout=10)
hdrs = {k: v for k, v in resp.headers.items()
if any(s in k.lower() for s in ["cf-", "datadome", "akamai"])}
print("Status:", resp.status_code) # 403/429 тоже диагностический сигнал
print("Headers:", hdrs)
print("Cookies:", list(resp.cookies.keys()))
except Exception as e:
# Дроп на TLS-уровне - сам по себе указывает на антибот
print("Blocked pre-HTTP:", type(e).__name__, e)
Методы обхода детекции ботов: практический арсенал
Главное правило browser fingerprint spoofing: согласованность всех параметров одновременно. TLS говорит Chrome 131 на Windows, User-Agent подтверждает, Client Hints совпадают - а canvas выдаёт рендер из другой ОС. Все предыдущие слои пройдены, но fingerprinting браузера провален. Один несогласованный параметр убивает весь стек.
Ротация прокси и OPSEC
IP-репутация - первый фильтр, срабатывающий до проверок fingerprint.Datacenter IP - диапазоны AWS, GCP, DigitalOcean публично известны. Антибот-системы блокируют их превентивно по ASN. По данным AbuseIPDB, ряд хостинг-провайдеров (включая "bulletproof" ASN) содержит высокую концентрацию IP с abuse confidence score выше 75 - порога, рекомендуемого для автоматической блокировки. Годятся только для целей без серьёзной защиты.
Residential IP - адреса домашних ISP. Смешиваются с легитимным трафиком и значительно сложнее для блокировки. Основной выбор для обхода Cloudflare антибот, DataDome и PerimeterX. Дорого, но работает.
Mobile IP - адреса мобильных операторов с CGNAT, где тысячи пользователей делят один IP. Самые сложные для блокировки, но и самые дорогие.
Ротация IP по каждому запросу - не всегда оптимально. Слишком частая смена адреса сама по себе подозрительна. Sticky-сессии (один IP на 30-60 секунд) с сохранением cookie jar между запросами дают более реалистичный профиль. Геолокация IP должна совпадать с
Accept-Language и timezone: IP из Бразилии в паре с Accept-Language: ru-RU - очевидный красный флаг. В MITRE ATT&CK ротация прокси маппится на External Proxy (T1090.002) и Multi-hop Proxy (T1090.003).Обход капчи и JS-челленджей
CAPTCHA - не первая линия обороны, а реакция на низкий trust-скор. Если TLS, fingerprint и поведение корректны, многие антибот-системы пропускают запрос без челленджа. По MITRE ATT&CK - Avoid CAPTCHA (T1696.002, Stealth): лучший обход капчи - сделать так, чтобы она не появилась.Cloudflare Turnstile - invisible-челлендж, генерирующий
cf_clearance cookie. Headless-браузер с корректным fingerprint часто проходит его автоматически. Без танцев с бубном.JS proof-of-work - Cloudflare и Kasada используют JavaScript, выполняющий вычисления в браузере и отправляющий результат на сервер. Без реального JS-движка пройти невозможно - чистые HTTP-клиенты здесь бессильны.
Визуальные CAPTCHA (reCAPTCHA, hCaptcha) обходятся через сервисы решения (2Captcha, CapMonster, Anti-Captcha): отправляете sitekey и URL через API, получаете токен, подставляете в следующий запрос. По MITRE ATT&CK - Automate CAPTCHA Completion (T1696.001, Stealth).
Kasada - отдельный зверь. По данным Scrapfly, это единственная система, где самостоятельный обход нежизнеспособен на постоянной основе. Kasada активно зондирует окружение исполнения (не пассивный fingerprinting), применяет анти-дебаг и анти-деобфускацию, а челленджи ротируются per-site. Характерная сигнатура - bare 429 с пустым телом без брендинга. Если увидели такой ответ и ничего в заголовках - скорее всего, это она.
Антибот-защита - гонка вооружений без финиша. Каждый раунд обновлений на стороне вендоров ломает часть рабочих bypass-техник. За десятки проектов, где стояла задача обхода WAF и антибот-систем для имитации реального атакующего, наблюдение одно: побеждает не конкретный инструмент, а согласованность всех слоёв одновременно. TLS-профиль, User-Agent, Client Hints, canvas, WebGL, геолокация IP, поведенческие паттерны - если хоть один слой противоречит остальным, trust-скор рушится. Большинство пентестеров фиксируются на одном уровне - ставят residential proxy или патчат webdriver - и не понимают, почему блокировки продолжаются. Проблема не в инструменте, а в рассогласованности сигналов.
И есть момент, который мало кто проговаривает: bypass-техники деградируют. То, что работало на Cloudflare три месяца назад, сегодня может не пройти. Поддержка актуальности стека - не разовая настройка, а непрерывный ресёрч с отслеживанием обновлений антибот-вендоров и актуализацией профилей. На HackerLab (ХакерЛаб) лежат web-задачи, где bypass-цепочку нужно собрать в полную последовательность от fingerprint до цели самостоятельно.
AI-выжимка
по разделам
Тезисы статьи скоро
Статья читается полностью. Тезисы со ссылками на разделы появятся позже.
Содержание
Codeby Academy
Практика и мастерство
От основ до продвинутого — программы для практиков Codeby.
Перейти к курсу →
Продолжить чтение
Следующий разбор
HTTP Request Smuggling эксплуатация: методология 2026
Комментарии
0