Receber por email
← Voltar para o catálogo

hunt-idor

Habilidade para caçar vulnerabilidades IDOR, desenvolvida a partir de 26 relatórios públicos de bug bounty. Utilize ao buscar IDOR em qualquer alvo.

2.6kestrelas
Atualizado há 4 meses

Ver no GitHub ↗ Licença: NOASSERTION

Como adicionar

/plugin marketplace add elementalsouls/Claude-BugHunter

O comando exato pode variar conforme o repositório. Confira o README no GitHub.

Para o autor da skill

Cole no README do seu repo

Mostra que sua skill está catalogada na Skillteca, gera backlink e tráfego rastreável.

[![Skillteca](https://www.skillteca.com.br/api/badge/hunt-idor/svg)](https://www.skillteca.com.br/skills/hunt-idor)

Alerta por categoria

Receba novas skills de Design e Frontend toda segunda

1 email curto, só com as skills novas de Design e Frontend. 4 minutos de leitura, sem spam, cancela com 1 clique.

Você confirma o email no primeiro envio. Sem spam. Cancela com 1 clique.

Ler descrição completa

Crown Jewel Targets

Why IDOR pays big:

  • Direct access to other users' data without authentication bypass — clear, demonstrable impact
  • Chains easily with privilege escalation, financial fraud, and account takeover
  • Affects virtually every application with user-owned resources

Highest-value asset types (by payout potential):

| Asset Type | Why It Pays | |---|---| | Financial documents / billing APIs | PII + financial data exposure (Shopify, Uber, PayPal) | | Private repositories / source code | IP theft, critical data loss (GitHub) | | User messages / DMs | Privacy violation at scale (Reddit) | | Account management endpoints | User addition, deletion, privilege escalation (PayPal, Mozilla) | | Business/org administration | Cross-tenant escalation, employee PII (Uber) | | Content moderation/admin actions | Operational sabotage (Reddit mod logs) |

Programs that pay most for IDOR:

  • Platforms with multi-tenancy (SaaS, B2B tools)
  • Fintech and payment processors
  • Social platforms with private content
  • Developer tools with org/repo isolation

Attack Surface Signals

URL patterns that scream IDOR:

/api/v1/users/{id}/
/api/v*/orders/{order_id}
/invoices/download?id=
/reports/{uuid}/
/messages/{thread_id}
/admin/orgs/{org_id}/members
/migration/{migration_id}/files
/graphql (query params with IDs)
/api/business/{business_id}/
/vouchers/{voucher_id}/policy

Response header signals:

  • Content-Type: application/json on endpoints accepting raw IDs
  • No X-Frame-Options or CORS misconfigs paired with ID params
  • Authorization: Bearer tokens that are user-scoped but hit org-level resources

JavaScript source patterns:

// Look for hardcoded or interpolated IDs in JS
fetch(`/api/v1/users/${userId}/profile`)
axios.get('/invoices/' + invoiceId)
graphql query { billingDocument(id: $docId) }
// Redux/state stores exposing foreign IDs
state.currentUser.organizationId

Tech stack signals:

  • GraphQL endpoints (query-based IDORs are often missed)
  • REST APIs with sequential integer IDs (most vulnerable)
  • UUIDs that are predictable or leaked in other responses
  • Multi-tenant SaaS apps with org_id, account_id, business_id params
  • Mobile apps (Burp the APK — mobile APIs often skip authorization checks)

Step-by-Step Hunting Methodology

  1. Map all object references in the application
  2. Browse every feature authenticated as User A
  3. Capture all requests in Burp Suite
  4. Filter for requests containing: id=, _id=, uuid=, /v1/{noun}/{id}, query params with numeric/UUID values
  1. Enumerate ID types
  2. Sequential integers → enumerate ±1, ±100
  3. UUIDs → check if they appear in other responses or JS files
  4. Hashed IDs → check if leaked in public endpoints, metadata, or GraphQL introspection
  1. Create two separate accounts (same privilege level)
  2. User A: resource owner
  3. User B: attacker account
  4. Log all IDs belonging to User A while authenticated as User A
  1. Replay User A's resource IDs as User B
  2. Replace session cookie/token with User B's credentials
  3. Send identical requests referencing User A's object IDs
  4. Test ALL HTTP verbs: GET, POST, PUT, PATCH, DELETE on each endpoint
  1. Test cross-tenant/cross-org scenarios
  2. Create accounts in separate organizations/businesses
  3. Test if Org B's session can reference Org A's IDs
  4. Pay special attention to admin/management endpoints
  1. Test GraphQL specifically
  2. Run introspection: { __schema { queryType { fields { name } } } }
  3. For every query/mutation taking an id argument, substitute another user's ID
  4. Test both queries (read) and mutations (write/delete)
  1. Test write/destructive operations, not just reads
  2. Can User B DELETE User A's resources?
  3. Can User B MODIFY User A's content?
  4. Can User B ADD themselves to User A's account?
  1. Chain IDORs together
  2. Use one IDOR's leaked data (org IDs, user IDs) to fuel the next
  3. IDOR → leaked ID → second IDOR → privilege escalation
  1. Test state-changing edge cases
  2. Expired tokens/invites that can still be accepted
  3. Race conditions on resource IDs
  4. Indirect references: ?sort=id or ?filter[user_id]=
  1. Document the exact differential
  2. Confirm User B has NO legitimate access to User A's resource
  3. Screenshot/log the 200 OK vs expected 403/404

Payload & Detection Patterns

Basic IDOR test with curl (swap cookie/token):

# Get User A's resource ID while authenticated as A
curl -s -H "Cookie: session=USER_A_SESSION" \
  https://target.com/api/v1/invoices/12345

# Replay with User B's session
curl -s -H "Cookie: session=USER_B_SESSION" \
  https://target.com/api/v1/invoices/12345

# Success = 200 OK with User A's data

GraphQL IDOR test:

curl -s -X POST https://target.com/graphql \
  -H "Authorization: Bearer USER_B_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query":"{ billingDocument(id: \"USER_A_DOC_ID\") { id amount pdfUrl } }"}'

Enumerate sequential IDs with ffuf:

ffuf -u "https://target.com/api/v1/orders/FUZZ" \
  -w ids.txt \
  -H "Authorization: Bearer USER_B_TOKEN" \
  -mc 200 \
  -o idor_results.json

Generate sequential ID wordlist:

# Generate IDs around a known value
known_id = 48291
with open("ids.txt", "w") as f:
    for i in range(known_id - 500, known_id + 500):
        f.write(str(i) + "\n")

Burp Intruder payload for IDOR scanning:

GET /api/messages/§12345§ HTTP/1.1
Host: target.com
Authorization: Bearer USER_B_TOKEN

# Mark §12345§ as injection point
# Use numeric sequential payload: 12000-13000
# Filter responses by length difference or status 200

JavaScript scraping for leaked IDs:

# Find IDs in JS bundles
curl -s https://target.com/static/app.js | grep -Eo '"id":"[a-f0-9-]{36}"' | sort -u

# Find object references in API responses
curl -s -H "Cookie: session=USER_A" \
  https://target.com/api/v1/dashboard | python3 -m json.tool | grep -i "_id"

Grep patterns for source code review:

# Missing authorization checks in common frameworks
grep -r "findById\|findOne\|getById" --include="*.js" .
grep -r "params\[:id\]\|params\['id'\]" --include="*.rb" .
grep -r "request\.args\.get\('id'\)" --include="*.py" .

# Look for direct ORM queries without user scoping
grep -r "Model\.find(params" --include="*.js" .
# vs secure pattern: Model.find({ id: params.id, userId: req.user.id })

IDOR via HTTP method tampering:

# Try undocumented methods
for method in GET POST PUT PATCH DELETE OPTIONS HEAD; do
  echo "=== $method ==="
  curl -s -X $method \
    -H "Authorization: Bearer USER_B_TOKEN" \
    https://target.com/api/v1/users/USER_A_ID/profile
done

Common Root Causes

  1. Missing ownership check in ORM queries

```javascript // VULNERABLE: fetches any record const invoice = await Invoice.findById(req.params.id);

// SECURE: scopes to authenticated user const invoice = await Invoice.findOne({ _id: req.params.id, userId: req.user.id }); ```

  1. Authorization at the route level, not object level
  2. Developer checks "is user logged in?" but not "does this user own this object?"
  3. Middleware confirms authentication; individual handlers skip ownership validation
  1. Trusting client-supplied IDs in request bodies
  2. Mobile apps or SPAs send org_id in POST body; server uses it directly without verifying caller belongs to that org
  1. GraphQL resolvers without field-level authorization
  2. Query resolvers fetch by ID from database without checking if the requesting user has permission
  3. Especially common when resolvers are auto-generated from schema
  1. Inconsistent authorization across HTTP verbs
  2. GET endpoint is protected; POST/DELETE on same resource path is not
  3. Common in APIs built incrementally by different developers
  1. **Indirect r
Compartilhar X LinkedIn