Bug Bounty Hunting Methodology: A Systematic Approach for Security Researchers

Most bug bounty hunters who don't find bugs aren't missing technical skill — they're missing methodology. They open a target, click around, throw some tools at it, and wonder why experienced hunters consistently outperform them on the same programs.

Systematic hunters map the attack surface before exploiting anything. They understand which vulnerability classes pay and which get triaged as informational. They write reports that get accepted on the first review. This guide covers the full workflow: from reading a program policy to getting paid.

Phase 1: Scope Analysis and Program Research

Before touching the target, spend 30–60 minutes on program research. This separates hunters who waste time on out-of-scope assets from those who find reportable bugs efficiently.

Reading the Policy

The program policy tells you what matters to the company. Read it line by line:

# Research the program before testing:
# Check HackerOne/Bugcrowd for disclosed reports on the program
# This tells you what has been found, what gets triaged, and what is informational

# Look for the program's previous disclosures:
# - What vulnerability classes does the program reward?
# - What was marked informational that you might waste time on?
# - Are there historical SSRF/IDOR findings suggesting these classes exist?

# Check the company's tech stack from public sources:
# - LinkedIn job postings (e.g. "must know Kubernetes" → likely Kubernetes)
# - GitHub public repos (tech stack, sometimes credentials in history)
# - BuiltWith / Wappalyzer for frontend stack

Asset Discovery

For wildcard-scoped programs, asset discovery is where you find targets that other hunters haven't exhausted yet.

# Subdomain enumeration:
subfinder -d example.com -o subdomains.txt
amass enum -passive -d example.com -o amass_out.txt
assetfinder --subs-only example.com >> subdomains.txt

# Combine and deduplicate:
sort -u subdomains.txt amass_out.txt | tee all_subs.txt

# Resolve live hosts:
cat all_subs.txt | httpx -status-code -title -tech-detect -o live_hosts.txt

# Port scan in-scope IPs:
cat live_hosts.txt | cut -d' ' -f1 | naabu -top-ports 1000 -o ports.txt

# Screenshot for visual triage:
cat live_hosts.txt | aquatone -out screenshots/

Phase 2: Reconnaissance and Tech Stack Fingerprinting

Targeted recon gives you vulnerability hypotheses before you test a single endpoint. Different stacks have characteristic vulnerability patterns.

# Fingerprint technologies:
whatweb https://app.example.com
wappalyzer-cli https://app.example.com

# Check HTTP response headers for stack clues:
curl -I https://app.example.com
# Server: nginx/1.18 → look for path traversal, alias traversal
# X-Powered-By: Express → Node.js, check prototype pollution, eval injection
# X-Powered-By: PHP/8.1 → type juggling, deserialization
# X-Amz-Request-Id → AWS S3 hosted, check bucket misconfigurations

# Crawl for endpoints:
gospider -s https://app.example.com -o crawl/ -c 10 -d 5
katana -u https://app.example.com -o katana_out.txt -d 5

# Extract JavaScript files for hidden endpoints:
cat live_hosts.txt | getJS --output js_files.txt
cat js_files.txt | xargs -I {} curl -s {} | grep -E "api/|/v[0-9]|endpoint" | sort -u

# Check for exposed API documentation:
for url in $(cat live_hosts.txt); do
  curl -s "$url/swagger.json" | jq '.paths | keys[]' 2>/dev/null
  curl -s "$url/openapi.yaml" 2>/dev/null | grep "^  /"
  curl -s "$url/api-docs" 2>/dev/null | head -20
done

Historical Data Sources

# Wayback Machine for historical endpoints:
waybackurls example.com | tee wayback.txt
gau example.com | tee gau.txt

# Extract parameters from historical URLs:
cat wayback.txt gau.txt | grep "?" | sort -u | tee params.txt

# Find interesting patterns:
cat params.txt | grep -E "redirect|url|next|callback|file|path|id|user|admin"

# Check for exposed secrets in GitHub:
# Search GitHub for: "example.com" api_key
# Search GitHub for: "example.com" password
# Use trufflehog or gitleaks on any public repos

Phase 3: Attack Surface Mapping

Before exploitation, map every distinct attack surface. Prioritize by impact potential.

Authentication Entry Points

Authorization Surfaces

File Handling

Integration Points

Phase 4: Vulnerability Testing by Class

Work systematically through vulnerability classes rather than testing randomly. Focus on high-impact classes first.

Broken Access Control (IDOR / BOLA)

IDOR is consistently one of the highest-paid vulnerability classes on major programs because impact is clear and undeniable.

# Create two test accounts (Account A, Account B)
# Log in as Account A, capture all requests that include an ID
# Change the ID to Account B's resources

# Find numeric IDs:
# GET /api/invoices/1234 → try 1235, 1236
# POST /api/messages {"to": "user_id_456"} → change to another user

# Find UUID-based IDs (harder to guess, but still test):
# Capture Account B's resource ID while logged in as B
# Switch to Account A and try accessing B's resource ID

# Test horizontal privilege escalation:
# Account A (regular user) accessing Account B's data
# Account A accessing admin endpoints
# Changing account_id or org_id parameters

# Test vertical privilege escalation:
# Regular user → admin actions
# Check if role is validated server-side or just in frontend
curl -H "X-Role: admin" https://api.example.com/admin/users
curl -H "Authorization: Bearer ${regular_token}" https://api.example.com/admin/settings

Server-Side Request Forgery (SSRF)

SSRF in modern cloud environments can lead to cloud credential theft (IMDS access), giving critical or P1 severity.

# Find SSRF entry points:
# - URL fields: webhook URLs, import by URL, link preview, PDF generators
# - Image URL fields: avatar by URL, background image URL
# - XML/JSON with URL values

# Test for blind SSRF with out-of-band detection:
# Use Burp Collaborator, interactsh, or requestbin

curl -X POST https://api.example.com/webhooks \
  -d '{"url": "https://YOUR-COLLABORATOR-URL.oastify.com/test"}'

# Test for cloud metadata access:
curl -X POST https://api.example.com/fetch \
  -d '{"url": "http://169.254.169.254/latest/meta-data/"}'

# AWS IMDSv1 → credential theft:
# http://169.254.169.254/latest/meta-data/iam/security-credentials/
# http://169.254.169.254/latest/meta-data/iam/security-credentials/ROLE_NAME

# GCP metadata:
# http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token

# Bypass filters:
# http://[::ffff:169.254.169.254]
# http://0x7f000001  (127.0.0.1 in hex)
# http://2130706433  (127.0.0.1 in decimal)
# http://127.1

Business Logic Flaws

These require understanding the application, not just pattern matching. High impact because automated scanners can't find them.

# Price manipulation:
# - Change price to 0 or negative in cart/checkout request
# - Apply coupon codes multiple times via race condition
# POST /checkout {"items": [{"id": 1, "price": 0.01}]}

# Workflow bypass:
# Skip steps in multi-step processes (email verification, KYC)
# Access step N directly without completing step N-1

# Race conditions:
# Concurrent requests for one-time-use resources (gift cards, promo codes)
# Transfer funds simultaneously to exploit double-spend

# Parameter pollution:
# userid=123&userid=456 (which one does the server use?)
# role=user&role=admin

# Negative quantity:
# Add -1 items to receive a credit instead of paying

Phase 5: Automation and Passive Scanning

Run automated scans in the background while doing manual testing. Don't rely on them exclusively — they miss business logic and chain vulnerabilities — but they find low-hanging fruit efficiently.

# Run nuclei with web application templates:
nuclei -u https://app.example.com \
  -t ~/nuclei-templates/vulnerabilities/ \
  -t ~/nuclei-templates/exposures/ \
  -severity medium,high,critical \
  -o nuclei_out.txt

# Run nuclei against all live hosts:
cat live_hosts.txt | nuclei \
  -t ~/nuclei-templates/cves/ \
  -t ~/nuclei-templates/misconfiguration/ \
  -o nuclei_batch.txt

# ffuf for directory/file discovery:
ffuf -u https://app.example.com/FUZZ \
  -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt \
  -mc 200,301,302,401,403 \
  -o ffuf_dirs.txt

# Parameter fuzzing on interesting endpoints:
ffuf -u "https://app.example.com/api/v1/user?FUZZ=test" \
  -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt \
  -mc 200 -fs 512

Phase 6: Chaining Vulnerabilities

Individual low-severity findings that can't be chained often get closed as informational. The skill is recognizing when two minor issues combine into a critical.

Common Chains

Finding A Finding B Chained Impact
Reflected XSS (self) CSRF on account action Account takeover via phishing
Open redirect OAuth state not validated Account hijacking via redirect token theft
Blind SSRF Internal service exposed Read internal API / cloud metadata
Stored XSS (limited scope) Admin panel reads same data XSS in admin → RCE or full account compromise
Subdomain takeover Auth cookie on parent domain Session hijacking across domains

Phase 7: Writing Reports That Get Paid

A valid finding with a poor report gets triaged as informational. A clear report with reproduction steps, impact explanation, and a suggested fix gets triaged as critical — and paid faster.

Report Structure

# Title: [Vulnerability Type] in [Feature] leads to [Impact]
# Good: "IDOR in /api/v2/invoices/{id} allows unauthenticated access to all customer invoices"
# Bad: "IDOR found in API"

# Severity: P1/Critical | P2/High | P3/Medium | P4/Low
# CVSS Score (if the program uses it)

## Summary
One paragraph. What is the vulnerability? Where is it? What can an attacker do with it?

## Steps to Reproduce
1. Log in as User A at https://app.example.com
2. Navigate to Settings > Invoices
3. Note invoice URL: https://app.example.com/api/v2/invoices/12345
4. Change 12345 to 12346 (another user's invoice ID)
5. Observe: full invoice data for another user is returned

## Proof of Concept
Include:
- Screenshots or screen recordings
- Raw HTTP requests/responses
- curl commands that reproduce the issue

## Impact
Be specific. "Attacker can access any user's invoice including billing address,
payment method last four digits, and purchase history."

Quantify when possible: "An attacker can enumerate all ~50,000 user invoices
by iterating IDs from 1 to 99999."

## Suggested Remediation
- Verify that the authenticated user owns the requested resource before returning it
- Use authorization checks server-side, not just in the frontend routing

Common Report Mistakes

Vulnerability Class Priority by ROI

Class Typical Severity Findability ROI
SSRF → cloud metadata Critical Medium Very High
IDOR (sensitive data) High–Critical High Very High
Authentication bypass Critical Low High
Stored XSS → admin High–Critical Medium High
SQL Injection Critical Low (modern apps) High if found
Business logic Medium–High Medium High (unique, hard to duplicate)
Reflected XSS Medium High Medium (crowded)
Missing security headers Informational Very High Zero (usually OOS)

Tools Reference

Purpose Tools
Subdomain enumeration subfinder, amass, assetfinder, dnsx
HTTP probing httpx, naabu, aquatone
Web crawling gospider, katana, hakrawler
Historical URLs waybackurls, gau, cariddi
Directory brute-force ffuf, feroxbuster
Vulnerability scanning nuclei, nikto
Proxy / intercepting Burp Suite Pro, OWASP ZAP
Out-of-band detection Burp Collaborator, interactsh, requestbin
Secrets detection trufflehog, gitleaks, SecretFinder

Getting Started: Your First Bug Bounty

Choose a program with a wide scope and a track record of paying. HackerOne's program directory and Bugcrowd's listing show historical statistics — pick programs that have recent paid reports, which indicates active triage and payment.

Start with the methodology in this guide rather than jumping straight to tools. Map the attack surface first. Choose one vulnerability class and test it exhaustively across the entire application before moving to the next. This depth-first approach consistently outperforms scanning randomly with tools.

Document everything. Your notes from program X become reusable context for program Y when the same tech stack or feature set appears. Over time, you'll develop pattern recognition: when you see a webhook URL field, you immediately know to test for SSRF. When you see numeric IDs, you immediately test for IDOR. Methodology becomes intuition.

Bug bounty hunting and security team scanning require the same fundamentals. Ironimo gives security teams the same systematic coverage as an experienced hunter — OWASP Top 10, API security, authentication flaws, and more — running continuously on your schedule. Built on Kali Linux tools, no black box.

Start free scan

Key Takeaways

← Back to Blog