Phân Tích Kỹ Thuật

Cách xử lý Cloudflare ở chế độ tấn công

"Tôi đang ở chế độ tấn công" (IUAM) của Cloudflare là một biện pháp phòng thủ DDoS buộc mọi khách truy cập phải vượt qua thử thách JavaScript 5 giây trước khi truy cập trang web. Đây là chế độ bảo vệ Cloudflare mạnh mẽ nhất, được người vận hành trang web kích hoạt thủ công trong các cuộc tấn công hoặc được bật vĩnh viễn trên các trang web có nguy cơ cao. Để truy cập tự động, IUAM tạo ra một thử thách JavaScript bắt buộc mà các máy khách HTTP truyền thống không thể vượt qua.


IUAM làm gì

Khi người điều hành trang web bật "Tôi đang ở chế độ tấn công" trong bảng điều khiển Cloudflare:

Every request → Cloudflare edge
    ↓
JavaScript challenge page served (HTTP 503)
    ↓
Browser executes JavaScript challenge (~5 seconds)
    ↓
Challenge answer submitted automatically
    ↓
<staging-session-cookie> cookie set
    ↓
Original page loaded with <staging-session-cookie> cookie

Trang thử thách IUAM

Trang thử thách trả về HTTP 503 và chứa:

Yếu tố Mục đích
jschl_vc Thử thách mã xác minh
pass Mã thông báo thời gian (thực thi chờ 5 giây)
jschl_answer Câu trả lời được tính toán bằng JavaScript
cf_chl_opt Tùy chọn thử thách
ray ID Cloudflare Ray cho yêu cầu
"Kiểm tra trình duyệt của bạn trước khi truy cập..." Thông báo hiển thị cho người dùng

Đặc điểm chính

  • Mã trạng thái HTTP 503** (KHÔNG phải 403)
  • Chờ bắt buộc 5 giây trước khi gửi thử thách
  • Yêu cầu thực thi JavaScript — các máy khách HTTP đơn giản không thành công
  • cookie — có hiệu lực trong ~30 phút, cho phép các yêu cầu tiếp theo
  • Toàn miền — mọi trang trên miền đều thể hiện thách thức

Xác định IUAM so với các biện pháp bảo vệ Cloudflare khác

import requests

def identify_cloudflare_protection(url):
    """Distinguish IUAM from other Cloudflare protections."""
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                      "AppleWebKit/537.36 Chrome/120.0.0.0",
    }

    response = requests.get(url, headers=headers, timeout=15, allow_redirects=False)
    html = response.text
    status = response.status_code

    if status == 503 and "jschl" in html:
        return "IUAM (I'm Under Attack Mode)"

    if status == 503 and "challenge-platform" in html:
        return "Managed Challenge"

    if status == 403 and "cf-ray" in str(response.headers):
        return "Blocked by WAF/Bot Management"

    if "cf-turnstile" in html:
        return "Turnstile widget"

    if "challenges.cloudflare.com" in html:
        return "Cloudflare challenge (generic)"

    if status == 200:
        return "No challenge (passed)"

    return f"Unknown (status: {status})"

Bảng phát hiện

tín hiệu IUAM Thử thách được quản lý cửa quay Khối WAF
Trạng thái HTTP 503 503 200 403
jschl trong cơ thể
Đợi 5 giây Đôi khi
Bộ <staging-session-cookie> Sau khi giải quyết Sau khi giải quyết
Trang thử thách Toàn trang Toàn trang Chỉ tiện ích Trang lỗi
Yêu cầu JS

Thử thách JavaScript hoạt động như thế nào

Thử thách JavaScript của IUAM được thiết kế để xác minh rằng khách truy cập có trình duyệt thực:

Luồng thử thách

  1. Cloudflare phục vụ trang thử thách với JavaScript bị xáo trộn
  2. JavaScript thực hiện tính toán: - Các phép toán trên chuỗi từ trang - phép đo DOM - Thực thi thời gian (tối thiểu 4-5 giây)
  3. Câu trả lời được tính toán — một giá trị bằng số dựa trên thử thách
  4. Biểu mẫu được tự động gửi tới Cloudflare với jschl_vc, passjschl_answer
  5. Cloudflare xác thực câu trả lời và thời gian
  6. Đã trả lại cookie <staging-session-cookie> — cho phép truy cập trong ~30 phút

Tại sao máy khách HTTP thất bại

# This will ALWAYS get the challenge page:
import requests
response = requests.get("https://iuam-protected-site.com")
# response.status_code == 503
# response.text contains "Checking your browser..."

# Plain HTTP clients cannot:
# - Execute JavaScript
# - Compute the challenge answer
# - Meet the timing requirement
# - Generate the required cookies

Giải IUAM bằng CaptchaAI

Cách 1: Bộ giải Cloudflare Challenge (khuyên dùng)

Phương pháp cloudflare_challenge của CaptchaAI xử lý trực tiếp các thách thức IUAM:

import requests
import time

API_KEY = "YOUR_API_KEY"
TARGET_URL = "https://iuam-protected-site.com/data"

# Step 1: Submit challenge to CaptchaAI
submit = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "cloudflare_challenge",
    "sitekey": "managed",
    "pageurl": TARGET_URL,
    "json": 1,
})

task_id = submit.json()["request"]
print(f"Task submitted: {task_id}")

# Step 2: Poll for result
for attempt in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY,
        "action": "get",
        "id": task_id,
        "json": 1,
    }).json()

    if result.get("status") == 1:
        token = result["request"]
        print(f"Challenge solved! Token: {token[:50]}...")
        break
    elif result.get("request") == "ERROR_CAPTCHA_UNSOLVABLE":
        print("Challenge could not be solved")
        break
else:
    print("Timed out waiting for solution")

# Step 3: Use <staging-session-cookie> cookie or token
# The response contains the clearance data needed to access the site

Cách 2: Tự động hóa trình duyệt với CaptchaAI

Đối với các phiên liên tục, hãy kết hợp trình duyệt headless với CaptchaAI:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import requests
import time

API_KEY = "YOUR_API_KEY"

# Launch browser
options = webdriver.ChromeOptions()
options.add_argument("")
driver = webdriver.Chrome(options=options)

# Navigate to IUAM page
driver.get("https://iuam-protected-site.com")

# Wait for challenge page to load
time.sleep(3)

# Check if IUAM challenge is present
if "Checking your browser" in driver.page_source or driver.title == "Just a moment...":
    print("IUAM challenge detected")

    # Option A: Wait for browser to solve natively (if not headless)
    try:
        WebDriverWait(driver, 15).until(
            lambda d: "Checking your browser" not in d.page_source
        )
        print("Challenge passed natively")
    except:
        print("Native solve failed — using CaptchaAI")
        # Submit to CaptchaAI for solving
        # Token submission via JavaScript injection

# After challenge is passed, extract cookies for API use
cookies = driver.get_cookies()
<staging-session-cookie> = next(
    (c["value"] for c in cookies if c["name"] == "<staging-session-cookie>"), None
)

if <staging-session-cookie>:
    print(f"<staging-session-cookie> obtained: {<staging-session-cookie>[:30]}...")

    # Use cookie with requests library
    session = requests.Session()
    for cookie in cookies:
        session.cookies.set(cookie["name"], cookie["value"])
    session.headers.update({
        "User-Agent": driver.execute_script("return navigator.userAgent"),
    })

    # Now make requests with the clearance cookie
    response = session.get("https://iuam-protected-site.com/api/data")
    print(f"Status: {response.status_code}")

driver.quit()

Node.js

const axios = require("axios");

const API_KEY = "YOUR_API_KEY";
const TARGET_URL = "https://iuam-protected-site.com/data";

async function solveIUAM() {
  // Submit challenge
  const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
    params: {
      key: API_KEY,
      method: "cloudflare_challenge",
      sitekey: "managed",
      pageurl: TARGET_URL,
      json: 1,
    },
  });

  const taskId = submit.data.request;
  console.log(`Task submitted: ${taskId}`);

  // Poll for result
  for (let i = 0; i < 60; i++) {
    await new Promise((r) => setTimeout(r, 5000));

    const result = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: taskId, json: 1 },
    });

    if (result.data.status === 1) {
      console.log("IUAM challenge solved!");
      return result.data.request;
    }
  }

  throw new Error("Timed out");
}

solveIUAM().then((token) => console.log("Token:", token.substring(0, 50)));

Cookie <staging-session-cookie> là đầu ra chính để giải quyết thử thách IUAM:

Tài sản Giá trị
Tên cookie <staging-session-cookie>
Trọn đời ~30 phút (có thể định cấu hình trang web)
Phạm vi Toàn miền
Bị ràng buộc với Địa chỉ IP + Tác nhân người dùng
Có thể tái sử dụng Vâng, suốt đời
Có thể chuyển nhượng Chỉ với cùng một IP + UA
import requests
import time

class IUAMSessionManager:
    """Manage <staging-session-cookie> cookies for IUAM-protected sites."""

    def __init__(self, api_key, target_url, user_agent=None):
        self.api_key = api_key
        self.target_url = target_url
        self.user_agent = user_agent or (
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 Chrome/120.0.0.0"
        )
        self.session = requests.Session()
        self.session.headers["User-Agent"] = self.user_agent
        self.clearance_time = 0
        self.clearance_lifetime = 1800  # 30 minutes default

    def needs_refresh(self):
        """Check if clearance cookie needs refreshing."""
        return time.time() - self.clearance_time > self.clearance_lifetime - 60

    def solve_challenge(self):
        """Solve IUAM challenge and update session cookies."""
        submit = requests.post("https://ocr.captchaai.com/in.php", data={
            "key": self.api_key,
            "method": "cloudflare_challenge",
            "sitekey": "managed",
            "pageurl": self.target_url,
            "json": 1,
        })

        task_id = submit.json()["request"]

        for _ in range(60):
            time.sleep(5)
            result = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": self.api_key,
                "action": "get",
                "id": task_id,
                "json": 1,
            }).json()

            if result.get("status") == 1:
                # Apply clearance to session
                self.clearance_time = time.time()
                return result["request"]

        raise TimeoutError("IUAM solve timed out")

    def get(self, url, **kwargs):
        """Make a GET request, solving IUAM if needed."""
        if self.needs_refresh():
            self.solve_challenge()
        return self.session.get(url, **kwargs)

Khắc phục sự cố

Triệu chứng nguyên nhân sửa chữa
Thử thách lặp đi lặp lại vô tận IP đã thay đổi sau khi được giải phóng mặt bằng Sử dụng IP nhất quán để giải quyết + truy cập
bị từ chối Tác nhân người dùng không khớp Sử dụng cùng một Tác nhân người dùng để giải quyết và yêu cầu
503 vẫn tồn tại sau khi giải quyết Cookie đã hết hạn (>30 phút) Làm mới giải phóng mặt bằng trước khi hết hạn
Trang thử thách khác với dự kiến Trang web sử dụng Thử thách được quản lý chứ không phải IUAM Chuyển sang phương pháp giải Turnstile
Nhiều trang thử thách Thử thách đầu tiên là IUAM, thứ hai là Turnstile Giải quyết tuần tự cả hai

Câu hỏi thường gặp

kéo dài bao lâu?

Mặc định là 30 phút, nhưng người vận hành trang web có thể định cấu hình từ 15 phút đến 24 giờ. Hầu hết các trang web sử dụng mặc định 30 phút. Lên kế hoạch làm mới trước khi hết hạn.

Tôi có thể chia sẻ giữa các yêu cầu không?

Có, nhưng chỉ từ cùng một địa chỉ IP và có cùng chuỗi Tác nhân người dùng. Việc thay đổi một trong hai sẽ làm mất hiệu lực cookie.

Chế độ Under Attack có luôn được bật không?

Không. Người vận hành trang web chuyển đổi thủ công trong các cuộc tấn công. Một số trang web để nó được kích hoạt vĩnh viễn như một lớp bảo mật bổ sung. Không có cách nào để dự đoán liệu một trang web có hoạt động IUAM hay không.

Sự khác biệt giữa IUAM và Thử thách được quản lý là gì?

IUAM thách thức mọi du khách vô điều kiện. Thử thách được quản lý sử dụng đánh giá bot của Cloudflare để thách thức có chọn lọc lưu lượng truy cập đáng ngờ. IUAM luôn trả về 503 với thử thách JS. Thay vào đó, Thử thách được quản lý có thể trả về 503 bằng tiện ích Cloudflare Turnstile.

IUAM có ảnh hưởng đến điểm cuối API không?

Vâng. IUAM áp dụng cho mọi yêu cầu trên miền, bao gồm cả điểm cuối API. Đây là lý do tại sao các yêu cầu API từ máy khách không có trình duyệt không thành công — chúng không thể thực hiện thử thách JavaScript.


Tóm tắt

Chế độ Under Attack Mode của Cloudflare tạo ra một thử thách JavaScript bắt buộc đối với tất cả khách truy cập, trả về HTTP 503 với yêu cầu tính toán trong 5 giây. Giải quyết các thử thách IUAM vớiBộ giải Cloudflare Challenge của CaptchaAI, sau đó sử dụng cookie <staging-session-cookie> cho các yêu cầu tiếp theo trong khoảng thời gian 30 phút. Luôn khớp địa chỉ IP và Tác nhân người dùng giữa việc giải quyết và sử dụng.

bài viết liên quan

Os comentários estão desativados para este artigo.