Basic Usage #
Command Structure #
bash Copy
ffuf -u URL -w WORDLIST
ffuf -h
ffuf -V
Basic Examples #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt
ffuf -u http://target.com/FUZZ.php -w /usr/share/wordlists/dirb/common.txt
ffuf -u http://target.com/FUZZ/FUZ2Z -w wordlist1.txt:FUZZ -w wordlist2.txt:FUZ2Z
Directory and File Fuzzing #
Basic Directory Fuzzing #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -e .php,.html,.txt
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -e .php,.html,.txt,.js,.css,.xml,.json
Advanced Directory Options #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -t 100
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -p 0.1
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -r
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -recursion -recursion-depth 2
File Extension Fuzzing #
bash Copy
ffuf -u http://target.com/index.FUZZ -w extensions.txt
echo -e "php\n html\n htm\n txt\n js\n css\n xml\n json\n asp\n aspx\n jsp" > extensions.txt
ffuf -u http://target.com/index.FUZZ -w extensions.txt
echo -e "bak\n old\n tmp\n backup\n ~\n swp" > backup_extensions.txt
ffuf -u http://target.com/index.FUZZ -w backup_extensions.txt
Parameter Fuzzing #
GET Parameter Fuzzing #
bash Copy
ffuf -u http://target.com/page.php?FUZZ= value -w parameters.txt
ffuf -u http://target.com/page.php?param1= FUZZ& param2 = FUZ2Z -w values1.txt:FUZZ -w values2.txt:FUZ2Z
ffuf -u http://target.com/page.php?FUZZ= test -w /usr/share/wordlists/SecLists/Discovery/Web-Content/burp-parameter-names.txt
POST Parameter Fuzzing #
bash Copy
ffuf -u http://target.com/login.php -w /usr/share/wordlists/SecLists/Passwords/Common-Credentials/10-million-password-list-top-1000.txt -X POST -d "username=admin&password=FUZZ" -H "Content-Type: application/x-www-form-urlencoded"
ffuf -u http://target.com/api/login -w passwords.txt -X POST -d '\\\\{"username":"admin","password":"FUZZ"\\\\}' -H "Content-Type: application/json"
ffuf -u http://target.com/login.php -w usernames.txt:USER -w passwords.txt:PASS -X POST -d "username=USER&password=PASS" -H "Content-Type: application/x-www-form-urlencoded"
Parameter Value Fuzzing #
bash Copy
ffuf -u http://target.com/page.php?id= FUZZ -w /usr/share/wordlists/SecLists/Fuzzing/SQLi/Generic-SQLi.txt
ffuf -u http://target.com/search.php?q= FUZZ -w /usr/share/wordlists/SecLists/Fuzzing/XSS/XSS-Jhaddix.txt
ffuf -u http://target.com/ping.php?host= FUZZ -w /usr/share/wordlists/SecLists/Fuzzing/command-injection-commix.txt
bash Copy
ffuf -u http://target.com/ -w user-agents.txt -H "User-Agent: FUZZ"
ffuf -u http://target.com/ -w header-values.txt -H "X-Custom-Header: FUZZ"
ffuf -u http://target.com/admin -w tokens.txt -H "Authorization: Bearer FUZZ"
HTTP Method Fuzzing #
bash Copy
ffuf -u http://target.com/api/endpoint -w methods.txt -X FUZZ
echo -e "GET\n POST\n PUT\n DELETE\n PATCH\n HEAD\n OPTIONS\n TRACE\n CONNECT" > methods.txt
bash Copy
ffuf -u http://target.com/ -w subdomains.txt -H "Host: FUZZ.target.com"
ffuf -u http://192.168.1.100/ -w subdomains.txt -H "Host: FUZZ.target.com"
Subdomain Fuzzing #
Basic Subdomain Fuzzing #
bash Copy
ffuf -u http://target.com/ -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -H "Host: FUZZ.target.com"
ffuf -u https://target.com/ -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -H "Host: FUZZ.target.com"
ffuf -u http://target.com/ -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -H "Host: FUZZ.target.com" -fs 1234
Advanced Subdomain Techniques #
bash Copy
ffuf -u http://target.com/ -w subdomains.txt:SUB1 -w subdomains.txt:SUB2 -H "Host: SUB1.SUB2.target.com"
ffuf -u http://target.com:8080/ -w subdomains.txt -H "Host: FUZZ.target.com"
ffuf -u http://target.com/ -w patterns.txt -H "Host: FUZZ-api.target.com"
Filtering and Matching #
Response Code Filtering #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -mc 200,301 ,302
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -fc 404,403
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -mc 200 -299
Response Size Filtering #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -fs 1234
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -fs 1000 -2000
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -ms 5678
Response Content Filtering #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -fw 100
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -mw 50 -100
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -fl 10
Response Text Filtering #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -fr "Not Found"
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -mr "Welcome"
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -fr "Error.*404"
Output and Reporting #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -o results.txt
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -o results.json -of json
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -o results.csv -of csv
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -o results.html -of html
Verbose Output #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -v
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -s
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -c
Advanced Techniques #
Rate Limiting and Stealth #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -t 1 -p 2
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -p 1 -3
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -timeout 30
Proxy and SSL Options #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -x http://127.0.0.1:8080
ffuf -u https://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -k
ffuf -u https://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -cert cert.pem
Authentication #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -H "Authorization: Basic $( echo -n 'user:pass' | base64) "
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -b "PHPSESSID=abc123; auth=token"
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
Wordlist Management #
Creating Custom Wordlists #
bash Copy
cat /usr/share/wordlists/dirb/common.txt /usr/share/wordlists/dirb/big.txt| sort -u > combined.txt
cewl http://target.com -w custom_wordlist.txt
echo -e "admin\n api\n v1\n v2\n test\n dev\n staging\n production" > custom_dirs.txt
Popular Wordlists #
bash Copy
/usr/share/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt
/usr/share/wordlists/SecLists/Discovery/Web-Content/common.txt
/usr/share/wordlists/SecLists/Discovery/Web-Content/big.txt
/usr/share/wordlists/SecLists/Discovery/Web-Content/burp-parameter-names.txt
/usr/share/wordlists/SecLists/Fuzzing/LFI/LFI-gracefulsecurity-linux.txt
/usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt
/usr/share/wordlists/SecLists/Discovery/DNS/fierce-hostlist.txt
Automation Scripts #
Comprehensive Web Fuzzing Script #
bash Copy
#!/bin/bash
TARGET = $1
OUTPUT_DIR = "ffuf_results_$( date +%Y%m%d_%H%M%S) "
if [ -z "$TARGET " ] ; then
echo "Usage: $0 <target_url>"
exit 1
fi
mkdir -p $OUTPUT_DIR
echo "[+] Starting comprehensive web fuzzing for $TARGET "
echo "[+] Directory fuzzing..."
ffuf -u $TARGET /FUZZ -w /usr/share/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -mc 200,301 ,302,403 -o "$OUTPUT_DIR /directories.json" -of json
echo "[+] File fuzzing..."
ffuf -u $TARGET /FUZZ -w /usr/share/wordlists/SecLists/Discovery/Web-Content/common.txt -e .php,.html,.txt,.js,.css,.xml,.json,.bak,.old -mc 200 -o "$OUTPUT_DIR /files.json" -of json
echo "[+] Parameter fuzzing..."
ffuf -u $TARGET /index.php?FUZZ= test -w /usr/share/wordlists/SecLists/Discovery/Web-Content/burp-parameter-names.txt -mc 200 -fs 0 -o "$OUTPUT_DIR /parameters.json" -of json
if [ [ $TARGET =~ ^https?://( [ ^/] +) ] ] ; then
DOMAIN = $\ \ \ \ { BASH_REMATCH [ 1 ] \ \ \ \ }
echo "[+] Subdomain fuzzing for $DOMAIN ..."
ffuf -u $TARGET -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -H "Host: FUZZ.$DOMAIN " -mc 200 -fs 0 -o "$OUTPUT_DIR /subdomains.json" -of json
fi
echo "[+] Fuzzing complete. Results saved in $OUTPUT_DIR /"
API Endpoint Fuzzing Script #
bash Copy
#!/bin/bash
API_BASE = $1
OUTPUT_FILE = "api_endpoints.json"
if [ -z "$API_BASE " ] ; then
echo "Usage: $0 <api_base_url>"
exit 1
fi
echo "[+] Fuzzing API endpoints for $API_BASE "
echo "[+] API version fuzzing..."
ffuf -u $API_BASE /FUZZ -w < ( echo -e "v1\n v2\n v3\n api\n api/v1\n api/v2\n api/v3" ) -mc 200,301 ,302 -o "api_versions.json" -of json
echo "[+] Common API endpoints..."
ffuf -u $API_BASE /api/FUZZ -w /usr/share/wordlists/SecLists/Discovery/Web-Content/api/api-endpoints.txt -mc 200,301 ,302 -o "api_endpoints.json" -of json
echo "[+] HTTP methods fuzzing..."
ffuf -u $API_BASE /api/users -w < ( echo -e "GET\n POST\n PUT\n DELETE\n PATCH\n HEAD\n OPTIONS" ) -X FUZZ -mc 200,201 ,204,301,302,405 -o "api_methods.json" -of json
echo "[+] API fuzzing complete."
Parameter Brute Force Script #
bash Copy
#!/bin/bash
TARGET_URL = $1
PARAM_NAME = $2
WORDLIST = $3
if [ -z "$TARGET_URL " ] || [ -z "$PARAM_NAME " ] || [ -z "$WORDLIST " ] ; then
echo "Usage: $0 <target_url> <parameter_name> <wordlist>"
exit 1
fi
echo "[+] Brute forcing parameter $PARAM_NAME on $TARGET_URL "
ffuf -u "$TARGET_URL ?$PARAM_NAME =FUZZ" -w $WORDLIST -mc 200 -fs 0 -o "param_bruteforce_get.json" -of json
ffuf -u $TARGET_URL -w $WORDLIST -X POST -d "$PARAM_NAME =FUZZ" -H "Content-Type: application/x-www-form-urlencoded" -mc 200 -fs 0 -o "param_bruteforce_post.json" -of json
echo "[+] Parameter brute force complete."
Burp Suite Integration #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -x http://127.0.0.1:8080
Nuclei Integration #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -mc 200 -o found_endpoints.json -of json
jq -r '.results[].url' found_endpoints.json > found_urls.txt
nuclei -l found_urls.txt -t /path/to/nuclei-templates/
Nmap Integration #
bash Copy
nmap -p 80,443 ,8080,8443 target.com --open -oG web_ports.txt
grep "80/open\|443/open\|8080/open\|8443/open" web_ports.txt| awk '\\\\{print $2\\\\}' | while read host ; do
ffuf -u "http://$host /FUZZ" -w /usr/share/wordlists/dirb/common.txt -mc 200,301 ,302
done
Threading and Speed #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -t 50
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -timeout 10
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -s
Memory Management #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-big.txt -t 30
watch -n 1 'ps aux|grep ffuf'
Troubleshooting #
Common Issues #
bash Copy
ffuf -u https://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -k
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -timeout 30
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -t 1 -p 2
ffuf -u http://192.168.1.100/FUZZ -w /usr/share/wordlists/dirb/common.txt -H "Host: target.com"
Debug Mode #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -v
ffuf -u http://target.com/test -w < ( echo "test" ) -v
Best Practices #
Fuzzing Strategy #
Start with common wordlists : Use small, targeted wordlists first
Use appropriate filters : Filter out noise to focus on interesting results
Technology-specific fuzzing : Use relevant wordlists for the target technology
Recursive fuzzing : Fuzz found directories for deeper enumeration
Parameter discovery : Don’t forget to fuzz for hidden parameters
Stealth Considerations #
bash Copy
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -t 1 -p 2 -5 -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -x http://proxy:8080
ffuf -u http://target.com/FUZZ -w /usr/share/wordlists/dirb/common.txt -H "User-Agent: $( shuf -n1 user_agents.txt) "