>samit_hota
Back to research
CAREER & ADVISORY

How to Land Your First Valid Bug Bounty Finding

Samit Hota·
#bug-bounty#web-security#application-security#career-advice

The quickest way to burn out in bug bounty hunting is setting up a multi-VPS recon pipeline to scan broad wildcards like *.uber.com or *.paytm.com. When you run subfinder into httpx into nuclei against high-visibility targets, you are competing against thousands of hunters—and hundreds of automated bots—who executed the exact same workflow seconds after the scope was updated.

You won’t beat them to a low-hanging CVE, and you won’t learn how applications actually break.

To land your first valid finding, you need to abandon wide-and-shallow recon in favor of deep, targeted manual analysis. This guide lays out a realistic workflow for choosing a manageable target, auditing it for high-probability logic flaws, and writing a report that gets triaged into a payout instead of marked as “Informative” or “Duplicate.”

Choose Scope Based on Complexity, Not Reward Size

Beginners routinely make two mistakes when picking a target: they either pick massive, hardened web apps with $10,000 bounties, or they pick non-paying Vulnerability Disclosure Programs (VDPs) with hundreds of assets and no clear boundaries.

To find your first bug, pick a target with three specific characteristics:

  1. Defined application boundaries: Choose a program that offers a single web application or a restricted API, rather than a broad *.example.com wildcard. You want an app you can fully map in an afternoon.
  2. Deep role-based functionality: Look for applications with multi-tenant architectures, administrative roles, custom user permissions, or team workspaces. Saas apps (HR platforms, CRM add-ons, project management tools) are prime candidates.
  3. Low hunter density: Target newly launched programs on platforms like Bugcrowd, HackerOne, or Intigriti, or focus on self-hosted enterprise software where you can run the target application locally.

When you analyze a target, check its authentication options. If an app lets you sign up for a free 14-day trial without talking to a sales rep, that is your target. You need direct, unimpeded access to set up multiple accounts.

The Two-Account Manual Workflow

Automated tools miss business logic flaws because they do not understand the implicit contract between user roles. The most reliable vulnerability type for a first finding is Broken Object Level Authorization (BOLA/IDOR) or Broken Function Level Authorization (BFLA).

To audit for these flaws effectively, you do not need complex scripts. You need Burp Suite Professional or Community Edition, two browsers (or containerized browser profiles), and two distinct accounts on the target application:

  • Account A (Attacker): High-privileged or Workspace Owner.
  • Account B (Victim): Low-privileged or member of a separate, isolated workspace.

Set up your environment to systematically test authorization boundaries across every endpoint:

  1. Log into Account A in Browser 1 and Account B in Browser 2. Proxy both through Burp Suite.
  2. In Burp Suite, go to Proxy -> HTTP history. Add a visual highlight or note to identify requests originating from Account A versus Account B.
  3. Using Account A, walk through every single feature of the application. Create, read, update, and delete every available resource (e.g., project boards, document uploads, profile fields, user invites).
  4. Identify every API endpoint handling structured identifiers. Pay special attention to endpoints accepting integer IDs (/api/v1/documents/1042), UUIDs (/api/v1/teams/b1a9...), or email addresses in POST/PUT request bodies.
  5. In Burp, use the Match and Replace feature (under Proxy -> Options or Settings -> Tools -> Proxy -> Match and Replace in newer versions) to automatically swap tokens. Set a rule to replace Account A’s session cookie or Authorization: Bearer <token> header with Account B’s header.
  6. Replay Account A’s actions through Burp. If Account B’s session token successfully modifies or views Account A’s resource, you have found an authorization bypass.

For endpoints using non-predictable IDs (like UUIDv4), test whether Account B can access Account A’s object if Account B knows the UUID. A common triager rejection happens when hunters claim an IDOR on a UUID without demonstrating how an attacker obtains that UUID. Look for secondary endpoints—such as auto-complete dropdowns, user directory listings, or exported CSV logs—that inadvertently leak these identifiers to low-privileged users.

Isolate High-Yield Logic Patterns

While mapping the application, stop looking for reflective XSS in search bars. Modern frameworks like React and Angular auto-sanitize output by default, making basic XSS rare on well-maintained targets. Instead, test these specific logic states:

State Transitions and Order Flow

Look for multi-step processes like checkout flows, onboarding wizards, or password reset sequences. Intercept the HTTP requests for each step and try out-of-order execution:

  • Can you call /api/v1/checkout/complete without passing /api/v1/checkout/payment?
  • Can you submit an account verification token (/api/v1/verify-email) while modifying the payload’s email field to a different user’s address?

Parameter Pollution and Unhandled Arrays

When an endpoint accepts a single string parameter (e.g., {"user_id": "102"}), test how the backend handles arrays or duplicate keys:

  • JSON Array: {"user_id": ["102", "103"]}
  • Query String Duplication: GET /api/v1/resource?id=102&id=103

Node.js/Express and Python/Django backends frequently handle duplicated parameters differently than the upstream web server or API gateway, leading to bypasses where security filters inspect the first value while the application logic processes the second.

File Upload Handling

If the application allows uploading profile pictures, attachments, or CSV imports, do not immediately upload a web shell. Test for SSRF and Path Traversal:

  • Change the filename in the Content-Disposition header: filename="../../../../../etc/passwd".
  • If the app parses SVG files, test for XML External Entity (XXE) vulnerabilities by injecting a basic external entity payload into the SVG file structure.

Write a Report That Forces Acceptance

Triagers at platforms like Bugcrowd and HackerOne handle dozens of low-quality, automated reports every hour. If your report requires them to guess your steps, decipher broken English, or install custom tools to verify the issue, they will close it or mark it as needs-more-info.

Structure your submission with absolute clarity. Avoid CVSS calculator grandstanding—do not label an account-scoped IDOR as a “CRITICAL 10.0 REMOTE CODE EXECUTION” just to get attention. State the realistic business impact plainly.

Use this exact structure for your report:

# Summary
A Broken Object Level Authorization (BOLA) vulnerability in the user settings API allows an authenticated low-privileged user to read and update private profile metadata (including phone numbers and internal user IDs) of users in external, unlinked organizations.

# Vulnerability Details
- **Vulnerable Endpoint:** `PUT /api/v1/organizations/{org_id}/members/{member_id}`
- **Vulnerable Parameter:** `member_id`
- **Authentication Required:** Low-privileged user account (Role: Member)

# Steps to Reproduce
1. Log into the application as User A (Attacker) and navigate to `https://app.target.com/settings/profile`.
2. Note User A's Organization ID (`org_123`) and Member ID (`mem_456`).
3. Log into a separate account in an unrelated organization as User B (Victim). Obtain User B's Member ID (`mem_789`).
4. As User A, send the following HTTP request using Burp Repeater or cURL, substituting User B's `member_id` into the endpoint path:

```http
PUT /api/v1/organizations/org_123/members/mem_789 HTTP/1.1
Host: app.target.com
Authorization: Bearer <USER_A_JWT>
Content-Type: application/json

{
  "job_title": "Pwned Account",
  "phone_number": "+15550199"
}
  1. Observe the HTTP 200 OK response containing User B’s updated metadata.
  2. Log back in as User B and confirm that the profile information has been modified without User B’s consent.

Proof of Concept

[Attach a single, clean screenshot or a raw cURL command demonstrating the 200 OK response with the leaked/modified payload]

Business Impact

An attacker can iterate through integer member_id values to modify profile data and extract non-public contact details across foreign tenant accounts, violating multi-tenant isolation boundaries.


Always provide a working `curl` command alongside HTTP request logs. A triager can copy-paste a `curl` execution into their terminal in five seconds; setting up custom Python scripts takes minutes. The lower the friction to reproduce your finding, the faster your report moves from triage to accepted, paid status.

Want a second set of eyes on your security posture?

Let's talk about where your real exposure is.

Book an advisory call