Web Application Fuzzing: Finding Hidden Bugs
Fuzzing is the art of throwing unexpected input at applications to discover vulnerabilities, hidden endpoints, and edge cases. This guide covers practical fuzzing techniques for web security testing and CTF competitions.
What is Web Fuzzing?โ
Web fuzzing automates the process of sending variations of input to web applications, analyzing responses to find:
- Hidden directories and files
- Injection vulnerabilities
- Authentication bypasses
- Parameter pollution
- Rate limiting issues
Unlike manual testing, fuzzing scales to test thousands of payloads in minutes.
Essential Fuzzing Toolsโ
ffuf - Fast Web Fuzzerโ
The modern choice for directory brute-forcing and parameter discovery:
# Directory fuzzing
ffuf -w wordlist.txt -u https://target.com/FUZZ
# Virtual host discovery
ffuf -w vhosts.txt -u https://target.com -H "Host: FUZZ.target.com"
# Parameter fuzzing
ffuf -w params.txt -u https://target.com?FUZZ=test
# POST data fuzzing
ffuf -w payloads.txt -u https://target.com/api -X POST -d "user=FUZZ"
Key features: Fast multithreading, response matching/filtering, multiple wordlist support, easy output formats.
wfuzz - Swiss Army Knifeโ
Versatile tool for complex fuzzing:
# Multiple injection points
wfuzz -w users.txt -w passwords.txt http://target.com/login?user=FUZZ&pass=FUZ2Z
# Filter by response code
wfuzz -w wordlist.txt --hc 404 http://target.com/FUZZ
Practical Fuzzing Techniquesโ
Directory and File Discoveryโ
Start with common wordlists from SecLists or Dirbuster:
# Common files
ffuf -w /usr/share/seclists/Discovery/Web-Content/common.txt \
-u https://target.com/FUZZ \
-mc 200,301,302,403
# Backup files
ffuf -w /usr/share/seclists/Discovery/Web-Content/backup-files.txt \
-u https://target.com/FUZZ \
-e .bak,.old,.backup,.swp
Pro tip: Fuzzing with extensions -e .php,.html,.txt,.zip often reveals hidden resources.
Parameter Pollutionโ
Test how applications handle duplicate parameters:
# Test parameter priority
curl "https://target.com/api?id=1&id=2&id=3"
# Array-style parameters
curl "https://target.com/api?user[]=admin&user[]=guest"
Applications may process the first, last, or all parameter values differently, leading to unexpected behavior.
Authentication Bypass Fuzzingโ
Test authentication mechanisms:
# Username enumeration
ffuf -w usernames.txt -u https://target.com/login \
-X POST -d "username=FUZZ&password=test" \
-fr "Invalid username"
# SQL injection patterns
wfuzz -w /usr/share/seclists/Fuzzing/SQLi/quick-SQLi.txt \
-u https://target.com/login \
-d "username=admin&password=FUZZ"
Filter by response differences: Size (-fs), lines (-fl), words (-fw), or regex (-fr).
Header Fuzzingโ
Test HTTP headers for injection points:
# User-Agent fuzzing
ffuf -w payloads.txt -u https://target.com -H "User-Agent: FUZZ"
# X-Forwarded-For bypass
ffuf -w ips.txt -u https://admin.target.com \
-H "X-Forwarded-For: FUZZ" -mc 200
Many applications trust headers like X-Forwarded-For, X-Real-IP, or X-Original-URL for access control.
Building Effective Wordlistsโ
Extract keywords from target site:
# Spider and extract unique words
cewl https://target.com -d 2 -m 5 -w wordlist.txt
# Combine multiple sources
cat wordlist1.txt wordlist2.txt | sort -u > combined.txt
Build wordlists based on reconnaissance:
- Technology stack (Laravel โ
routes,api,admin) - Industry (finance โ
payment,transaction,account) - Framework patterns (Django โ
api/v1,admin/,static/)
Fuzzing Strategiesโ
Progressive Fuzzingโ
1. Quick scan - Small wordlist (1k-5k entries)
2. Medium scan - Targeted wordlist (10k-50k)
3. Deep scan - Large comprehensive list (100k+)
Start fast, then dive deeper based on findings.
Response Analysisโ
Look beyond status codes:
- Size anomalies - Different response size may indicate success
- Timing attacks - Slower responses might indicate database queries
- Error messages - Stack traces reveal technology details
- Redirect chains - 302 โ 200 may indicate successful bypass
Rate Limiting Awarenessโ
Avoid IP bans:
# Add delays
ffuf -w wordlist.txt -u https://target.com/FUZZ -p 0.5
# Use proxy rotation
ffuf -w wordlist.txt -u https://target.com/FUZZ -x http://proxy:8080
Common CTF Fuzzing Patternsโ
Hidden admin panels - Fuzz /admin, /panel, /dashboard, /manager
Backup files - .bak, .old, .swp, .save, ~
Config files - .env, .git/config, wp-config.php, web.config
API versions - /api/v1, /api/v2, /api/internal
Debug endpoints - /debug, /test, /dev, /staging
Quick CTF Scriptโ
#!/bin/bash
TARGET=$1
echo "[+] Quick directory fuzz"
ffuf -w /usr/share/seclists/Discovery/Web-Content/common.txt \
-u $TARGET/FUZZ -mc 200,301,302,403 -t 50
echo "[+] Backup file check"
ffuf -w /usr/share/seclists/Discovery/Web-Content/backup-files.txt \
-u $TARGET/FUZZ -mc 200 -t 50
Fuzzing Best Practicesโ
Start with reconnaissance - Know your target before fuzzing
Filter noise - Use response size/content filters to reduce false positives
Test locally first - Understand application behavior before live testing
Respect scope - Only fuzz authorized targets
Document findings - Keep logs of successful payloads
Conclusionโ
Fuzzing transforms manual testing into automated discovery. Master these tools and techniques to find hidden vulnerabilities faster, whether in CTF challenges or real-world assessments.
Start with directory fuzzing, progress to parameter testing, and always analyze responses carefully. The difference between a 404 and a 403 can be the key to finding your next bug.
Happy fuzzing!