Most engineers think…
"I turned on Brute Force Protection, so login attacks are handled."
Wrong — and this is the #1 reason a WAF "doesn't stop the attack". Brute-force protection only runs once ASM knows the page is a login: the login URL, and which form parameters carry the username and password. Without that mapping, ASM can't tell a successful login from a failed one — so it can't count failures, and nothing triggers. And even with detection on, a single per-IP threshold misses a distributed botnet entirely. Real login protection is three instincts: see the login, tell a noisy IP from a slow swarm, and escalate friction only when you must.
① See the login first — URL + username + password
Picture a bank branch where the guard counts how many times each person fails the ID check at the counter. That only works if the guard knows which counter is the ID counter and what a failed check looks like. ASM is the same: before it can count failed logins, it must know the login URL and which parameters carry the username and password.
This is the single most-missed step. BIG-IP Advanced WAF (formerly ASM) can auto-detect login pages during policy building, but on custom apps and APIs you almost always configure it by hand under Security ▸ Application Security ▸ Sessions and Logins ▸ Login Pages. You tell ASM: this is the login URL, this parameter is the username, this parameter is the password, and here is how a successful vs failed login looks (an HTTP redirect, a string in the response, or a status code). Get this right and ASM can finally count failures. Get it wrong and brute-force protection silently does nothing.
Sneha at Infosys faces this
Sneha enabled Brute Force Attack Prevention, then ran a test password-spray against the app's login. Nothing triggered. The feature "doesn't work".
ASM never detected the login page. The app is a custom SPA that posts to /api/auth, and auto-detection missed it — so there's no login URL and no username/password mapping for ASM to count failures against.
Add the login page manually: URL /api/auth, username parameter uname, password parameter pword, and a failed-login criterion (e.g. HTTP 401 or response string "Invalid credentials").
Re-run the spray. Security ▸ Reporting ▸ Application ▸ Brute Force Attacks now shows detections counting up against the login URL.
▶ Watch a login attempt get counted — then watch ASM go blind
Rahul at TCS sends a wrong password to /login. Press Play for the login-aware path, then Break it to see what happens when the login URL was never configured.
/login/login as the login URL and reads the username/password params401 → ASM marks it a failed login, increments the counterAdvanced WAF brute-force protection isn't triggering even under an obvious password-spray. What's the most likely cause?
Pause & Predict
A single IP hammers your login 400 times a minute — easy to spot and block. But the next attacker spreads 8,000 attempts across 4,000 IPs, 2 each. A per-IP threshold of "10 failures" never trips on any single IP. What kind of detection would catch this swarm? Type your guess.
② Source-based vs distributed — one noisy IP vs a slow swarm
There are two completely different shapes of brute force, and ASM has a separate mitigation for each. Mix them up and you'll block the easy attacker while the dangerous one walks straight through.
Source-based brute force is the loud one: a single IP fires hundreds of failed logins. ASM counts failures per source IP and, when one IP crosses the source threshold, mitigates that IP. Easy.
Distributed brute force is the quiet, dangerous one: thousands of botnet IPs each try only 2–3 logins. No single IP ever looks suspicious. So ASM watches the overall failed-login rate for the login URL — when the page-wide failure rate spikes, it mitigates the attack as a whole, even though every individual IP is "innocent".
Analogy: source-based is one person trying 500 keys on one door — the guard spots them instantly. Distributed is 500 people each trying one key — no single person looks suspicious, but the guard watching the door notices it's being jiggled non-stop.
A real internet login gets both shapes of attack. Enable source-based (for the noisy IP), distributed (for the botnet), and where available session-based / device-ID detection (tracks failures per client session, catching an attacker who rotates IPs but reuses one browser). Source-IP alone is the classic gap: it misses the distributed swarm and over-blocks shared NAT egress IPs.
Priya at Flipkart faces this
Priya configured a source-based threshold of 20 failed logins. The SOC still sees account takeovers, but the Brute Force report shows almost no blocked IPs.
The attack is distributed. Each botnet IP makes 3–4 attempts and stays under 20, so source-based never fires. Only distributed detection — watching the login URL's overall failure rate — can catch it.
Enable distributed mitigation alongside source-based, set a sensible page-wide failed-login rate trigger, and add session-based detection so IP-rotating bots are tracked by device.
Re-run the distributed test. The Brute Force Attacks report now shows a "Distributed attack — mitigated" entry with the challenge action applied.
One IP sends 400 failed logins a minute; meanwhile 4,000 botnet IPs each try 2 logins. Which mitigation mode catches the second attack?
Pause & Predict
ASM has decided this is an attack. It could just block immediately — but blocking everyone risks punishing real users behind a shared NAT IP. What's a low-friction first step ASM can take that stops a dumb bot but is invisible to a real human? Type your guess.
③ The escalation stack — friction only when you must
Once ASM decides a login is under attack, it doesn't go straight to a hard block. It escalates through a mitigation stack, adding friction one rung at a time so legitimate users feel the smallest possible interruption.
- 1. Client-Side Integrity — a silent JavaScript challenge. The browser solves a small puzzle and echoes it back. Humans see nothing; script-only bots fail here. This is the preferred first response — it filters the cheap bots at zero cost to real users.
- 2. CAPTCHA — if the attack persists (often the better bots that do run JS), ASM presents a CAPTCHA. It adds real friction, so it's escalated, not led with.
- 3. Blocking / drop — the hard stop. For a clearly malicious source or a sustained distributed attack, ASM drops the request. Reserve this for the cases where challenges aren't enough, and prefer scoping it (per source / per session) over a blanket IP ban.
Analogy: a metro gate. First it just checks your card silently (Client-Side Integrity). If something's off, a guard asks you a quick question (CAPTCHA). Only if you clearly can't pass does the gate physically lock (block). You don't lock the gate on every passenger — you escalate.
▶ Watch mitigation escalate — then watch it over-block
Karthik at Wipro's login is under attack. Play the healthy escalation, then Break it to see the over-blocking trap.
/loginThe four mitigation mechanics — tap each card
Each card front names the mechanic; the back gives you the "so what" — when to reach for it.
Silent JS challenge the browser solves automatically. So what: your zero-friction first filter — stops script bots without a real user ever noticing.
Human-only challenge. So what: escalate to it only when the silent challenge isn't enough — it adds real friction for humans.
Watches the login URL's overall failure rate, not per-IP. So what: the only mode that catches a slow botnet where no single IP looks bad.
Compares submitted credentials to a breached-credential database. So what: catches credential stuffing — valid-but-stolen logins a failure counter never sees.
Why does Advanced WAF prefer Client-Side Integrity (a JavaScript challenge) before showing a CAPTCHA?
Pause & Predict
A botnet uses valid username/password pairs leaked from another site's breach. Each login succeeds, so a failed-login counter never fires. How could ASM possibly flag these technically-valid logins as malicious? Type your guess.
④ Credential stuffing & validating — the stolen-key attack, proven
Credential stuffing is the attack that breaks a pure failed-login defense. The attacker isn't guessing — they're replaying real pairs from another site's breach, betting users reused passwords. Most attempts succeed on the first try, so there are no failures to count.
ASM answers this with leaked-credential detection: it compares the submitted credentials against a known-breached-credentials database. A match means "this pair is in the wild" — so even a valid login gets flagged or challenged. Pair this with the escalation stack and session-based detection, and you stop the stuffing bot while real users sail through.
Build it — the configuration
You wire all of this on one screen. Here's the order: map the login, enable both detection shapes, set the escalation, then turn on leaked-credential checks.
tmsh list asm policy app_pol login-pages # expected: a login URL with username/password parameter mapping (tmui) Security ▸ Application Security ▸ Sessions and Logins ▸ Login Pages URL: /login Username parameter: uname Password parameter: pword Login result: Failed = HTTP status 401 | Successful = redirect to /dashboard
Login page "/login" found for policy app_pol. username-parameter uname password-parameter pword # If this returns empty → ASM has no login to protect. Add it before anything else.
Security ▸ Application Security ▸ Brute Force Attack Prevention ▸ Login Page = /login Source-Based Protection: Enabled Failed logins >= 20 / min per source IP Distributed Protection: Enabled Login-URL rate >= 100 / min (page-wide) Session-Based Protection: Enabled (track failures per device/session) Mitigation (escalating): Client-Side Integrity -> CAPTCHA -> Drop Credential Stuffing: Enabled (Detect leaked credentials) Apply Policy
Policy "app_pol" applied. Brute Force Attack Prevention active on /login. source-based ON (20/min/IP) · distributed ON (100/min) · session ON mitigation: client-side-integrity -> captcha -> drop credential-stuffing leaked-credential check: ON
Don't start with a hard Drop and a blanket source-IP block. Many real users share one egress IP behind corporate NAT or a carrier proxy — a 24-hour IP ban after 10 failures punishes everyone behind that IP. Lead with Client-Side Integrity, escalate to CAPTCHA, and use session-based detection so you isolate the actual attacker's device instead of a whole NAT pool. Tune thresholds during a known traffic spike (a sale, a launch) so a real burst doesn't get CAPTCHA'd.
▶ Watch a credential-stuffing login get caught
Aditya at HCL's login is hit with a valid-but-stolen pair. Play the leaked-credential catch, then Break it to see what slips through without the check.
uname=priya&pword=<leaked> to /loginNever claim brute-force protection works from the config screen. Run a safe test (a controlled spray from a lab IP, or a distributed test tool), then open Security ▸ Reporting ▸ Application ▸ Brute Force Attacks. Read the columns: was the attack Detected, and crucially Mitigated? Which mitigation action fired (challenge / CAPTCHA / block)? Source-based or distributed? If you see "Detected" but never "Mitigated", the policy is likely in Transparent mode or the action is Alarm-only — switch to Blocking.
Security ▸ Reporting ▸ Application ▸ Brute Force Attacks Filter: Policy = app_pol · Login URL = /login · last 1 hour Columns: Attack Type · Detection Mode · Mitigation · Action · Source
2026-06-02 02:14 /login Distributed brute force Detected + Mitigated Action: Client-Side Integrity -> CAPTCHA (page rate 240/min > 100) 2026-06-02 02:15 /login Source brute force Detected + Mitigated Action: Drop Source: 203.0.113.7 (412 fails/min > 20) 2026-06-02 02:16 /login Credential stuffing Detected + Mitigated Action: Challenge (submitted pair matched leaked-credential DB) # "Detected" but never "Mitigated"? → policy is Transparent or action is Alarm-only. Switch to Blocking.
Credential stuffing succeeds with valid username/password pairs and low per-IP volume. Which ASM feature is designed for exactly this?
🤖 Ask the AI Tutor
Tap any question — instant, scoped to this lesson. No login, no waiting.
Pre-curated from F5 BIG-IP Advanced WAF docs + community Q&A, scoped to Brute Force & Credential Stuffing. For a live prod issue, paste your Brute Force Attacks export into chat.techclick.in.
📝 Wrap-up assessment — six more
You've answered 4 inline. Six left. 70% (7 of 10) marks the lesson complete on your profile. Tap Submit all answers at the end.
🧠 In your own words
Type one line: why does a source-based failed-login threshold completely miss a distributed botnet? Then compare to the expert version.
🗣 Teach a friend
Best way to lock it in — explain it in one line to a teammate. Tap to generate a paste-ready summary.
📖 Glossary
- Login URL
- The exact URL of your login form (e.g.
/login,/api/auth). ASM must know it before it can watch for brute force. - Username / password parameters
- The form-field names ASM maps to the username and password. Without this mapping ASM can't tell a successful login from a failed one.
- Source-based brute force
- Brute force from a single IP. ASM counts failed logins per source IP and mitigates that IP at the source threshold.
- Distributed brute force
- Brute force spread across thousands of IPs, each with only a few attempts. ASM watches the login URL's overall failed-login rate instead of per-IP counts.
- Session-based detection
- Tracks failed logins per client session/device, catching an attacker who rotates IPs but reuses one browser — and avoiding NAT over-blocking.
- Client-Side Integrity
- A silent JavaScript challenge the browser solves automatically. Real browsers pass invisibly; simple bots that can't run JS fail. The preferred first mitigation.
- CAPTCHA
- A human-only challenge. ASM escalates to it only when the silent challenge isn't enough, because it adds friction for real users.
- Credential stuffing
- Replaying username/password pairs stolen from one breach against other sites. Logins succeed, so failed-login counters don't fire.
- Leaked-credential detection
- ASM compares submitted credentials against a database of known-breached pairs; a match is flagged/challenged even on a technically valid login.
- Brute Force Attacks report
- The reporting screen (Security ▸ Reporting ▸ Application) showing whether each attack was Detected and Mitigated, and which action fired. The proof, not the config screen.
📚 Sources
- F5 — BIG-IP Advanced WAF / ASM: Configuring Brute Force Attack Prevention · Detecting and Preventing Brute Force Attacks · Source-Based, Distributed & Session-Based detection · Login Page configuration. techdocs.f5.com / clouddocs.f5.com
- F5 — About Credential Stuffing & Leaked Credentials Detection · Mitigating Credential Stuffing · F5 Distributed Cloud / Advanced WAF credential-protection. techdocs.f5.com
- F5 — Client-Side Integrity & CAPTCHA mitigation · Configuring Login Pages and Login Enforcement (failed/successful login criteria). techdocs.f5.com
- F5 DevCentral community — "Brute force protection not triggering" / "Login page not detected" / "Distributed brute force tuning" threads (login-mapping gotchas, NAT over-blocking, transparent-mode pitfalls). community.f5.com
- OWASP — Credential Stuffing Prevention Cheat Sheet · Blocking Brute Force Attacks (escalating challenges, leaked-credential checks, why source-IP blocking over-blocks shared egress). owasp.org
- F5 Certified 303 — BIG-IP ASM Specialist blueprint: brute-force & credential-stuffing mitigation, login enforcement, reporting (exam objectives). f5.com/education
- Practitioner reference — "Have I Been Pwned" / breached-credential corpora and how WAFs use them for credential-stuffing detection; F5 Labs credential-stuffing reports. f5.com/labs
What's next?
You can now make ASM see the login, tell a noisy IP from a slow swarm, escalate friction sensibly, and catch credential stuffing — then prove it in the report. Next, see how ASM masks sensitive data in responses and blocks OWASP-class leaks with DataGuard.