Hacktricks-skills web-fuzzing-wfuzz
How to use WFuzz for web application fuzzing and brute force testing. Use this skill whenever the user mentions web fuzzing, brute forcing login forms, directory enumeration, parameter discovery, header testing, cookie brute forcing, HTTP method testing, or any web application security assessment that involves testing multiple values against a target. Make sure to use this skill for any web penetration testing task that requires systematic testing of inputs, even if the user doesn't explicitly mention "fuzzing" or "brute force."
install
source · Clone the upstream repo
git clone https://github.com/abelrguezr/hacktricks-skills
manifest:
skills/pentesting-web/web-tool-wfuzz/SKILL.MDsource content
WFuzz Web Fuzzing Guide
WFuzz is a web application fuzzing tool that replaces the
FUZZ keyword with payload values to systematically test web applications for vulnerabilities.
Core Concept
WFuzz replaces any reference to the
FUZZ keyword with values from a payload list:
= first payload positionFUZZ
= second payload positionFUZ2Z
= third payload position, etc.FUZ3Z
Installation
# Kali Linux (pre-installed) # Or install manually: pip install wfuzz
Basic Syntax
wfuzz [options] -w <wordlist> <url>
Filtering Options
Filter results to show only interesting responses:
By Response String
--hs "regex" # Hide responses matching regex --ss "regex" # Show only responses matching regex
By HTTP Status Code
--hc CODE # Hide responses with this status code --sc CODE # Show only responses with this status code --sc 200,202 # Show multiple codes (comma-separated)
By Response Size
--hl NUM # Hide by number of lines --sl NUM # Show by number of lines --hw NUM # Hide by number of words --sw NUM # Show by number of words --hh NUM # Hide by number of characters --sh NUM # Show by number of characters
Output Options
wfuzz -e printers # List available output formats -f /tmp/output,csv # Save output to CSV file
Encoders
Transform payloads before sending:
wfuzz -e encoders # List available encoders
Available encoders:
urlencode, md5, base64, hexlify, uri_hex, double urlencode
Usage:
-z file,/path/to/file,md5 # Hash each value with MD5 -w /path/to/file,base64 # Encode values in base64 -z list,value1,value2,hexlify # Inline list with hex encoding
Common Attack Patterns
1. Login Form Brute Force
Single list (username only)
wfuzz -c -w users.txt --hs "Invalid username" \ -d "name=FUZZ&password=secret&autologin=1" \ http://target.com/login.php
Two lists (username + password)
wfuzz -c -z file,users.txt -z file,pass.txt --sc 200 \ -d "name=FUZZ&password=FUZ2Z&autologin=1" \ http://target.com/login.php
With cookies and proxy
wfuzz -c -w users.txt -w pass.txt --ss "Welcome" \ -p 127.0.0.1:8080:HTTP \ -b "PHPSESSIONID=abc123;custom=cookie" \ "http://target.com/login?user=FUZZ&pass=FUZ2Z"
2. Directory/Endpoint Discovery
# Filter out 404s to find existing endpoints wfuzz -c -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \ --hc 404 \ http://target.com/FUZZ # Whitelist specific codes (200, 301, 302, 403) wfuzz -c -w wordlist.txt --sc 200,202,204,301,302,307,403 \ http://target.com/uploads/FUZZ
3. API Parameter Discovery
# Test common API parameters wfuzz -c -w /usr/share/wordlists/SecLists/Discovery/Web-Content/param-minimal.txt \ --hc 404 \ https://target.com/api/FUZZ # Path parameters wfuzz -c -w params.txt --hw 11 \ 'http://target.com/path%3BFUZZ=FUZZ'
4. Header-Based Attacks
Basic Authentication
wfuzz -c -w users.txt -w pass.txt --ss "Welcome" \ -p 127.0.0.1:8080:HTTP \ --basic FUZZ:FUZ2Z \ http://target.com/admin
NTLM Authentication
wfuzz -c -w users.txt -w pass.txt --ss "Welcome" \ -p 127.0.0.1:8080:HTTP \ --ntlm 'domain\\FUZZ:FUZ2Z' \ http://target.com/admin
Cookie Brute Force
wfuzz -c -w users.txt --ss "Welcome" \ -p 127.0.0.1:8080:HTTP \ -H "Cookie: user=FUZZ" \ http://target.com/dashboard
User-Agent Testing
wfuzz -c -w user-agents.txt --hc 403 \ -p 127.0.0.1:8080:HTTP \ -H "User-Agent: FUZZ" \ http://target.com/
Virtual Host Discovery
wfuzz -c -w subdomains.txt --hc 400,404,403 \ -H "Host: FUZZ.target.com" \ -u http://target.com \ -t 100
5. HTTP Method Testing
# Test different HTTP methods wfuzz -c -w methods.txt --sc 200 -X FUZZ \ http://target.com/admin # Inline method list wfuzz -z list,GET-HEAD-POST-TRACE-OPTIONS -X FUZZ \ http://target.com/
Best Practices
- Always use
flag for colored output (easier to read)-c - Filter aggressively - hide common responses (404, 403) to reduce noise
- Use appropriate wordlists - match the attack type to the wordlist
- Test with proxy - use Burp Suite or similar for traffic inspection
- Save results - use
to export findings for later analysis-f - Rate limit - use
flag to control thread count and avoid detection-t - Verify findings - fuzzing produces false positives; manually verify results
Common Wordlists
# Directory enumeration /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt /usr/share/wordlists/dirb/common.txt # Subdomain discovery /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-20000.txt # API parameters /usr/share/wordlists/SecLists/Discovery/Web-Content/param-minimal.txt # HTTP methods /usr/share/wordlists/SecLists/Discovery/Web-Content/http-methods.txt
Troubleshooting
Slow performance
- Reduce thread count:
-t 10 - Use smaller wordlists
- Add timeout:
--timeout 5
Too many false positives
- Tighten filters (use
instead of--sc
)--hc - Add multiple filter conditions
- Verify with manual requests
Connection errors
- Check proxy configuration
- Verify target is accessible
- Use
for slow targets--timeout