# FFUF (Fuzz Faster U Fool) Skill - Detailed Guide > This file contains the detailed procedure and reference material extracted from `SKILL.md` for focused loading. The root skill defines activation, examples, safety constraints, and limitations. ## Overview FFUF is a fast web fuzzer written in Go, designed for discovering hidden content, directories, files, subdomains, and testing for vulnerabilities during penetration testing. Throughput depends on target, limits and workload; do not assume a performance advantage. ## Installation ```bash # Using Go # Select a reviewed exact version before installation; do not use latest implicitly. go install github.com/ffuf/ffuf/v2@ # Using Homebrew (macOS) brew install ffuf # Binary download # Download from: https://github.com/ffuf/ffuf/releases/latest ``` ## Core Concepts ### The FUZZ Keyword The `FUZZ` keyword is used as a placeholder that gets replaced with entries from your wordlist. You can place it anywhere: - URLs: `https://target.example/FUZZ` - Headers: `-H "Host: FUZZ"` - POST data: `-d "username=admin&password=FUZZ"` - Multiple locations with custom keywords: `-w wordlist.txt:CUSTOM` then use `CUSTOM` instead of `FUZZ` ### Multi-wordlist Modes - **clusterbomb**: Tests all combinations (default) - cartesian product - **pitchfork**: Iterates through wordlists in parallel (1-to-1 matching) - **sniper**: Tests one position at a time (for multiple FUZZ positions) ## Common Use Cases ### 1. Directory and File Discovery ```bash # Basic directory fuzzing ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' # With file extensions ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -e .php,.html,.txt,.pdf # Colored and verbose output ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -c -v # With recursion (finds nested directories) ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -recursion -recursion-depth 2 ``` ### 2. Subdomain Enumeration ```bash # Virtual host discovery ffuf -w /path/to/subdomains.txt -u 'https://target.example' -H "Host: FUZZ.target.example" -fs 4242 # Note: -fs 4242 filters out responses of size 4242 (adjust based on default response size) ``` ### 3. Parameter Fuzzing ```bash # GET parameter names ffuf -w /path/to/params.txt -u 'https://target.example/script.php?FUZZ=test_value' -fs 4242 # GET parameter values ffuf -w /path/to/values.txt -u 'https://target.example/script.php?id=FUZZ' -fc 401 # Multiple parameters ffuf -w params.txt:PARAM -w values.txt:VAL -u 'https://target.example/?PARAM=VAL' -mode clusterbomb ``` ### 4. POST Data Fuzzing ```bash # Basic POST fuzzing ffuf -w /path/to/passwords.txt -X POST -d "username=admin&password=FUZZ" -u 'https://target.example/login.php' -fc 401 # JSON POST data ffuf -w entries.txt -u 'https://target.example/api' -X POST -H "Content-Type: application/json" -d '{"name": "FUZZ", "key": "value"}' -fr "error" # Fuzzing multiple POST fields ffuf -w users.txt:USER -w passes.txt:PASS -X POST -d "username=USER&password=PASS" -u 'https://target.example/login' -mode pitchfork ``` ### 5. Header Fuzzing ```bash # Custom headers ffuf -w /path/to/wordlist.txt -u 'https://target.example' -H "X-Custom-Header: FUZZ" # Multiple headers ffuf -w /path/to/wordlist.txt -u 'https://target.example' -H "User-Agent: FUZZ" -H "X-Forwarded-For: 127.0.0.1" ``` ## Filtering and Matching ### Matchers (Include Results) - `-mc`: Match status codes (default: 200-299,301,302,307,401,403,405,500) - `-ml`: Match line count - `-mr`: Match regex - `-ms`: Match response size - `-mt`: Match response time (e.g., `>100` or `<100` milliseconds) - `-mw`: Match word count ### Filters (Exclude Results) - `-fc`: Filter status codes (e.g., `-fc 404,403,401`) - `-fl`: Filter line count - `-fr`: Filter regex (e.g., `-fr "error"`) - `-fs`: Filter response size (e.g., `-fs 42,4242`) - `-ft`: Filter response time - `-fw`: Filter word count ### Auto-calibration and baseline validation `-ac` sends extra calibration requests and can suppress real results. Use only within the approved request budget; compare unfiltered baseline/canary responses before choosing it. Record exact flags, calibration values, filtered counts, errors and stopped/incomplete runs. Never assume a supplied result set used calibration or that an empty filtered result proves no accessible resources. ```bash # Local authorized lab example, 1 worker / 1 req/s / 20-second total budget. ffuf -w approved-small-list.txt -u 'https://target.example/FUZZ' -ac -t 1 -rate 1 -maxtime 20 -timeout 5 -mc all ``` ## Rate Limiting and Timing ### Rate Control ```bash # Limit to 2 requests per second (stealth mode) ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -rate 2 # Add delay between requests (0.1 to 2 seconds random) ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -p 0.1-2.0 # Set number of concurrent threads (default: 40) ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -t 10 ``` ### Time Limits ```bash # Maximum total execution time (60 seconds) ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -maxtime 60 # Maximum time per job (useful with recursion) ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -maxtime-job 60 -recursion ``` ## Output Options ### Output Formats ```bash # JSON output ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -o results.json # HTML output ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -of html -o results.html # CSV output ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -of csv -o results.csv # All formats ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -of all -o results # Silent mode (no progress, only results) ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -s # Pipe to file with tee ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -s | tee results.txt ``` ## Advanced Techniques ### Using Raw HTTP Requests (Critical for Authenticated Fuzzing) This is one of the most powerful features of ffuf, especially for authenticated requests with complex headers, cookies, or tokens. **Workflow:** 1. Capture a full authenticated request (from Burp Suite, browser DevTools, etc.) 2. Save it to a file (e.g., `req.txt`) 3. Replace the value you want to fuzz with the `FUZZ` keyword 4. Use the `--request` flag ```bash # From a file containing raw HTTP request ffuf --request req.txt -w /path/to/wordlist.txt -ac ``` **Example req.txt file:** ```http POST /api/v1/users/FUZZ HTTP/1.1 Host: target.example User-Agent: Mozilla/5.0 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... Cookie: session=abc123xyz; csrftoken=def456 Content-Type: application/json {"action":"view","id":"1"} ``` **Use Cases:** - Fuzzing authenticated endpoints with complex auth headers - Testing API endpoints with JWT tokens - Fuzzing with CSRF tokens, session cookies, and custom headers - Testing endpoints that require specific User-Agents or Accept headers - POST/PUT/DELETE requests with authentication **Pro Tips:** - You can place FUZZ in multiple locations: URL path, headers, body - Use `-request-proto https` if needed (default is https) - Always use `-ac` to filter out authenticated "not found" or error responses - Great for IDOR testing: fuzz user IDs, document IDs, etc. in authenticated contexts ```bash # Common authenticated fuzzing patterns ffuf --request req.txt -w user_ids.txt -ac -mc 200 -o results.json # With multiple FUZZ positions using custom keywords ffuf --request req.txt -w endpoints.txt:ENDPOINT -w ids.txt:ID -mode pitchfork -ac ``` ### Proxy Usage ```bash # HTTP proxy (useful for Burp Suite) ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -x http://127.0.0.1:8080 # SOCKS5 proxy ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -x socks5://127.0.0.1:1080 # Replay matched requests through proxy ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -replay-proxy http://127.0.0.1:8080 ``` ### Cookie and Authentication ```bash # Using cookies ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -b "sessionid=abc123; token=xyz789" # Client certificate authentication ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -cc client.crt -ck client.key ``` ### Encoding ```bash # URL encoding ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -enc 'FUZZ:urlencode' # Multiple encodings ffuf -w /path/to/wordlist.txt -u 'https://target.example/FUZZ' -enc 'FUZZ:urlencode b64encode' ``` ### Testing for Vulnerabilities ```bash # SQL injection testing ffuf -w sqli_payloads.txt -u 'https://target.example/page.php?id=FUZZ' -fs 1234 # XSS testing ffuf -w xss_payloads.txt -u 'https://target.example/search?q=FUZZ' -mr "