skills/waf/SKILL.md
Use when detecting, fingerprinting, or bypassing WAF blocks, rate limits, payload filtering, blocked probes, CDN security rules, or application firewall behavior during testing.
npx skillsauth add ghostonbutterbread/bug-bounty-harness wafInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Auto-detect and bypass WAF blocks in any harness.
Read shared state in this order before testing:
notes/summary.mdnotes/observations.mdchecklist.md (WAF items only)todo.md (WAF items only)Use agents/bypass_harness.py when you need a CLI entrypoint and want agents/waf_interceptor.py engaged automatically. Use agents/waf_interceptor.py directly only when embedding the interceptor into a custom harness or a narrow manual repro.
python agents/bypass_harness.py --target https://target.com/admin --type 403 \
--program target --concurrency 5 --rps 1
agents/waf_interceptor.py
| Mode | Use When | What It Does |
|------|----------|--------------|
| fingerprint | You need to identify the blocking layer first | Detects likely WAF family from responses |
| tier1 | Plain requests are blocked but payloads are simple | Retries with delays, header rotation, cookies, and path tricks |
| tier2 | Payload-carrying requests are blocked after Tier 1 | Obfuscates query values in addition to Tier 1 bypasses |
| wrap | Another harness already made the request | Reuses the existing response and only retries if blocked |
# WAF-aware 403 probing
python agents/bypass_harness.py --target https://target.com/admin --type 403 \
--program target --concurrency 5 --rps 1
# WAF-aware SSRF probing
python agents/bypass_harness.py --target https://target.com/fetch?url=x --type ssrf \
--param url --program target --concurrency 5 --rps 1
agents/bypass_harness.py| Option | Description |
|--------|-------------|
| --target, -t | Target URL (required) |
| --type, -T | Bypass type such as 403, ssrf, idor, or race |
| --param, -p | Parameter name for injection-driven types |
| --program | Program name for shared storage |
| --output-dir, -o | Override raw artifact directory |
| --timeout | Request timeout in seconds |
| --concurrency, -c | Max parallel requests |
| --rps | Requests per second |
| --verbose, -v | Verbose debug output |
| --quiet, -q | Show hits only |
from agents.waf_interceptor import WAFInterceptor
# Sync (uses requests)
waf = WAFInterceptor(target="https://target.com", program="acme")
resp = waf.get("/admin")
resp = waf.post("/api/login", json={"user": "test"})
# Async (pass existing httpx.AsyncClient)
resp = await waf.aget("/admin", client=client)
# Wrap an already-made response (zero-cost if not blocked)
resp = await waf.wrap_async(client, "GET", url, resp)
| WAF | Detection Method |
|---|---|
| Akamai | Body: AkamaiGHost, Reference #, AS-DOS-CID |
| Cloudflare | Body: Ray ID:, cf-ray header, Checking your browser |
| AWS WAF / CloudFront | Body: Generated by cloudfront, X-Cache: Error header |
| Imperva / Incapsula | Body: Incapsula incident ID, incap_ses cookie |
| F5 BIG-IP | Body: TS=4b63, support ID, BIGipServer cookie |
| Sucuri | Body: Sucuri WebSite Firewall, sucuri-waf header |
| Wordfence | Body: generated by Wordfence, wordfence.com |
| ModSecurity | Body: ModSecurity, mod_security |
| FortiWeb | Body: FortiWeb, Attack ID: |
| Citrix NetScaler | Body: Netscaler, NSC_ cookie |
| DDoS-Guard | Body: DDoS protection by, ddos-guard |
| PerimeterX | Body: px-captcha, pxi.pub |
| DataDome | Body/header: datadome |
Each WAF has a tailored bypass list, followed by generic fallbacks:
delay: N seconds)X-Forwarded-For, CF-IPCountry, True-Client-IP//, /%2e, etc.~/Shared/bounty_recon/{program}/agent_shared/findings/waf/
├── blocks_log.txt # Every WAF block: WAF name, method, path, status, evidence
├── bypasses_log.txt # Every successful bypass: technique + result status
└── summary.json # Running stats: total_requests, waf_blocks, bypass_success, bypass_fail
Already integrated. All _get() calls in BypassOrchestrator automatically:
detect_waf()wrap_async() until bypass succeeds or list exhaustedfrom agents.waf_interceptor import WAFInterceptor
import httpx
resp = httpx.get("https://target.com/admin")
waf_name = WAFInterceptor.fingerprint(resp)
print(waf_name) # "Cloudflare" | "Akamai" | None
waf = WAFInterceptor(target=..., program=...)
# ... make requests ...
waf.print_summary()
# [WAF Interceptor Summary]
# Total requests : 150
# WAF blocks : 12 (8.0%)
# Bypasses OK : 9 (75.0%)
# Bypasses fail : 3
$HARNESS_ROOT/prompts/waf-playbook.md$HARNESS_SHARED_BASE/{program}/agent_shared/$HARNESS_SHARED_BASE/{program}/agent_shared/findings/waf/findings.md$HARNESS_SHARED_BASE/{program}/agent_shared/findings/waf/prompts/waf-playbook.md.agents/bypass_harness.py for CLI-driven testing or agents/waf_interceptor.py directly inside a custom flow.agent_shared/findings/waf/findings.md.checklist.md, todo.md, and relevant notes.testing
Systematic live request mutation: flip booleans, field ops, headers, content-type, parser differentials, replay vs intercept, null/empty testing. Inherits live-testing-policy scope/rate/ownership rules.
development
Test password reset, forgot-password, reset-token, email reset, and account recovery flows for account takeover risks.
tools
Targeted param/field discovery using tech stack clues, naming conventions, and controlled-rate ffuf — then feeds findings into request-exploration for mutation. Not brute-force; informed and scoped.
testing
Ghost-only workflow for creating approved bug bounty test accounts and saving credential references.