"I'm Under Attack Mode" (IUAM) Cloudflare adalah pertahanan DDoS yang memaksa setiap pengunjung melalui JavaScript challenge 5 detik sebelum mengakses situs. Ini adalah mode perlindungan Cloudflare paling agresif, dipicu secara manual oleh operator situs saat serangan atau diaktifkan permanen di situs berisiko tinggi. Untuk akses otomatis, IUAM menciptakan JavaScript challenge wajib yang tidak dapat dilewati oleh klien HTTP biasa.
Apa yang Dilakukan IUAM
Saat operator situs mengaktifkan "I'm Under Attack Mode" di dashboard Cloudflare:
Every request → Cloudflare edge
↓
JavaScript challenge page served (HTTP 503)
↓
Browser executes JavaScript challenge (~5 seconds)
↓
Challenge answer submitted automatically
↓
qa_validation_cookie cookie set
↓
Original page loaded with qa_validation_cookie cookie
Halaman Challenge IUAM
Halaman challenge mengembalikan HTTP 503 dan berisi:
| Elemen | Tujuan |
|---|---|
jschl_vc |
Kode verifikasi challenge |
pass |
Token waktu (menerapkan tunggu 5 detik) |
jschl_answer |
Jawaban yang dihitung dengan JavaScript |
cf_chl_opt |
Opsi challenge |
ray |
Cloudflare Ray ID untuk request tersebut |
| "Checking your browser before accessing..." | Pesan yang terlihat pengguna |
Karakteristik Utama
- HTTP 503 kode status (BUKAN 403)
- Wajib tunggu 5 detik sebelum submit challenge
- Eksekusi JavaScript diperlukan — klien HTTP biasa gagal
- Cookie
qa_validation_cookie— valid ~30 menit, memungkinkan request berikutnya - Seluruh domain — setiap halaman di domain menampilkan challenge
Mengidentifikasi IUAM vs Perlindungan Cloudflare Lainnya
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})"
Tabel Deteksi
| Sinyal | IUAM | Managed Challenge | Turnstile | WAF Block |
|---|---|---|---|---|
| Status HTTP | 503 | 503 | 200 | 403 |
jschl di body |
✅ | ❌ | ❌ | ❌ |
| Tunggu 5 detik | ✅ | Terkadang | ❌ | ❌ |
Set qa_validation_cookie |
Setelah solve | Setelah solve | ❌ | ❌ |
| Halaman challenge | Full-page | Full-page | Widget saja | Halaman error |
| JS diperlukan | ✅ | ✅ | ✅ | ❌ |
Cara Kerja JavaScript Challenge
JavaScript challenge IUAM dirancang untuk memverifikasi bahwa pengunjung memiliki browser asli:
Alur Challenge
- Cloudflare menyajikan halaman challenge dengan JavaScript yang diobfuskasi
- JavaScript melakukan komputasi: - Operasi matematika pada string dari halaman - DOM measurement - Penegakan timing (minimal 4–5 detik)
- Jawaban dihitung — nilai numerik berdasarkan challenge
- Form disubmit secara otomatis ke Cloudflare dengan
jschl_vc,pass, danjschl_answer - Cloudflare memvalidasi jawaban dan timing
- Cookie
qa_validation_cookiedikembalikan — memungkinkan akses selama ~30 menit
Mengapa Klien HTTP Gagal
# 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
Solve IUAM dengan CaptchaAI
Metode 1: Cloudflare Challenge Solver (disarankan)
Metode cloudflare_challenge CaptchaAI menangani IUAM challenge secara langsung:
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 qa_validation_cookie cookie or token
# The response contains the clearance data needed to access the site
Metode 2: Otomatisasi Browser dengan CaptchaAI
Untuk sesi persisten, gabungkan headless browser dengan 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()
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()
qa_validation_cookie = next(
(c["value"] for c in cookies if c["name"] == "qa_validation_cookie"), None
)
if qa_validation_cookie:
print(f"qa_validation_cookie obtained: {qa_validation_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)));
Mengelola Cookie qa_validation_cookie
Cookie qa_validation_cookie adalah hasil utama dari solve IUAM challenge:
| Properti | Nilai |
|---|---|
| Nama cookie | qa_validation_cookie |
| Lifetime | ~30 menit (dapat dikonfigurasi situs) |
| Cakupan | Seluruh domain |
| Terikat pada | Alamat IP + User-Agent |
| Dapat digunakan kembali | Ya, selama lifetime |
| Dapat dipindahkan | Hanya dengan IP + UA yang sama |
Strategi Manajemen Cookie
import requests
import time
class IUAMSessionManager:
"""Manage qa_validation_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)
Pemecahan Masalah
| Gejala | Penyebab | Solusi |
|---|---|---|
| Challenge berulang tanpa henti | IP berubah setelah mendapat clearance | Gunakan IP yang konsisten untuk solve + akses |
| qa_validation_cookie ditolak | User-Agent tidak cocok | Gunakan User-Agent yang sama untuk solve dan request |
| 503 tetap ada setelah solve | Cookie kedaluwarsa (>30 menit) | Refresh clearance sebelum kedaluwarsa |
| Halaman challenge berbeda dari yang diharapkan | Situs menggunakan Managed Challenge, bukan IUAM | Beralih ke metode Turnstile solver |
| Beberapa halaman challenge | Challenge pertama IUAM, kedua Turnstile | Solve keduanya secara berurutan |
Pertanyaan yang sering diajukan
Berapa lama qa_validation_cookie bertahan?
Standarnya 30 menit, tetapi operator situs dapat mengonfigurasinya dari 15 menit hingga 24 jam. Sebagian besar situs menggunakan waktu default 30 menit. Rencanakan untuk refresh sebelum kedaluwarsa.
Bisakah saya membagikan qa_validation_cookie antar request?
Ya, tapi hanya dari alamat IP yang sama dan dengan string User-Agent yang sama. Mengubah keduanya akan membuat cookie tidak valid.
Apakah Under Attack Mode selalu diaktifkan?
Tidak. Operator situs mengaktifkannya secara manual saat serangan. Beberapa situs membiarkannya aktif permanen sebagai lapisan keamanan tambahan. Tidak ada cara untuk memprediksi apakah suatu situs akan memiliki IUAM aktif.
Apa perbedaan antara IUAM dan Managed Challenge?
IUAM challenge setiap pengunjung tanpa syarat. Managed Challenge menggunakan penilaian bot Cloudflare untuk secara selektif challenge traffic yang mencurigakan. IUAM selalu mengembalikan 503 dengan JS challenge. Managed Challenge mungkin menampilkan 503 dengan widget Turnstile.
Apakah IUAM memengaruhi endpoint API?
Ya. IUAM berlaku untuk setiap request pada domain, termasuk endpoint API. Inilah sebabnya request API dari klien non-browser gagal — mereka tidak dapat mengeksekusi JavaScript challenge.
Ringkasan
Cloudflare Under Attack Mode membuat JavaScript challenge wajib bagi semua pengunjung, mengembalikan HTTP 503 dengan komputasi 5 detik. Solve IUAM challenge dengan Cloudflare Challenge Solver CaptchaAI, lalu gunakan cookie qa_validation_cookie untuk request berikutnya dalam 30 menit. Selalu cocokkan alamat IP dan User-Agent antara solve dan penggunaan.
Artikel Terkait
- Cloudflare Challenge vs Turnstile: Cara Mendeteksi
- Cloudflare Challenge: Parameter Halaman dan Alur Token
- Panduan Cookie qa_validation_cookie Cloudflare Challenge