Idor Testing

Skillsystem1231Verified

This skill should be used when the user asks to "test for insecure direct object references," "find IDOR vulnerabilities," "exploit broken access control," "enumerate user IDs or object references," or "bypass authorization to access other users' data." It provides comprehensive guidance for detecting, exploiting, and remediating IDOR vulnerabilities in web applications.

Install CommandLocked
npx claude-code-templates@latest --skill ••••••••••••••••••••
Unlock to reveal command
Byzebbern
claude-code — security idor testing
$

Interactive Terminal Locked

Unlock this skill to run and inspect the interactive installation sequence.

CookApps Fine Software Cuisine
CONTENT

IDOR Vulnerability Testing

Purpose

Provide systematic methodologies for identifying and exploiting Insecure Direct Object Reference (IDOR) vulnerabilities in web applications. This skill covers both database object references and static file references, detection techniques using parameter manipulation and enumeration, exploitation via Burp Suite, and remediation strategies for securing applications against unauthorized access.

Inputs / Prerequisites

  • Target Web Application: URL of application with user-specific resources
  • Multiple User Accounts: At least two test accounts to verify cross-user access
  • Burp Suite or Proxy Tool: Intercepting proxy for request manipulation
  • Authorization: Written permission for security testing
  • Understanding of Application Flow: Knowledge of how objects are referenced (IDs, filenames)
  • Outputs / Deliverables

  • IDOR Vulnerability Report: Documentation of discovered access control bypasses
  • Proof of Concept: Evidence of unauthorized data access across user contexts
  • Affected Endpoints: List of vulnerable API endpoints and parameters
  • Impact Assessment: Classification of data exposure severity
  • Remediation Recommendations: Specific fixes for identified vulnerabilities
  • Core Workflow

    1. Understand IDOR Vulnerability Types

    Direct Reference to Database Objects

    Occurs when applications reference database records via user-controllable parameters:

    # Original URL (authenticated as User A)
    example.com/user/profile?id=2023
    
    # Manipulation attempt (accessing User B's data)
    example.com/user/profile?id=2022
    Direct Reference to Static Files

    Occurs when applications expose file paths or names that can be enumerated:

    # Original URL (User A's receipt)
    example.com/static/receipt/205.pdf
    
    # Manipulation attempt (User B's receipt)
    example.com/static/receipt/200.pdf

    2. Reconnaissance and Setup

    Create Multiple Test Accounts
    Account 1: "attacker" - Primary testing account
    Account 2: "victim" - Account whose data we attempt to access
    Identify Object References

    Capture and analyze requests containing:

  • Numeric IDs in URLs: /api/user/123
  • Numeric IDs in parameters: ?id=123&action=view
  • Numeric IDs in request body: {"userId": 123}
  • File paths: /download/receipt_123.pdf
  • GUIDs/UUIDs: /profile/a1b2c3d4-e5f6-...
  • Map User IDs
    # Access user ID endpoint (if available)
    GET /api/user-id/
    
    # Note ID patterns:
    # - Sequential integers (1, 2, 3...)
    # - Auto-incremented values
    # - Predictable patterns

    3. Detection Techniques

    URL Parameter Manipulation
    # Step 1: Capture original authenticated request
    GET /api/user/profile?id=1001 HTTP/1.1
    Cookie: session=attacker_session
    
    # Step 2: Modify ID to target another user
    GET /api/user/profile?id=1000 HTTP/1.1
    Cookie: session=attacker_session
    
    # Vulnerable if: Returns victim's data with attacker's session
    Request Body Manipulation
    # Original POST request
    POST /api/address/update HTTP/1.1
    Content-Type: application/json
    Cookie: session=attacker_session
    
    {"id": 5, "userId": 1001, "address": "123 Attacker St"}
    
    # Modified request targeting victim
    {"id": 5, "userId": 1000, "address": "123 Attacker St"}
    HTTP Method Switching
    # Original GET request may be protected
    GET /api/admin/users/1000 → 403 Forbidden
    
    # Try alternative methods
    POST /api/admin/users/1000 → 200 OK (Vulnerable!)
    PUT /api/admin/users/1000 → 200 OK (Vulnerable!)

    4. Exploitation with Burp Suite

    Manual Exploitation
    1. Configure browser proxy through Burp Suite
    2. Login as "attacker" user
    3. Navigate to profile/data page
    4. Enable Intercept in Proxy tab
    5. Capture request with user ID
    6. Modify ID to victim's ID
    7. Forward request
    8. Observe response for victim's data
    Automated Enumeration with Intruder
    1. Send request to Intruder (Ctrl+I)
    2. Clear all payload positions
    3. Select ID parameter as payload position
    4. Configure attack type: Sniper
    5. Payload settings:
       - Type: Numbers
       - Range: 1 to 10000
       - Step: 1
    6. Start attack
    7. Analyze responses for 200 status codes
    Battering Ram Attack for Multiple Positions
    # When same ID appears in multiple locations
    PUT /api/addresses/§5§/update HTTP/1.1
    
    {"id": §5§, "userId": 3}
    
    Attack Type: Battering Ram
    Payload: Numbers 1-1000

    5. Common IDOR Locations

    API Endpoints
    /api/user/{id}
    /api/profile/{id}
    /api/order/{id}
    /api/invoice/{id}
    /api/document/{id}
    /api/message/{id}
    /api/address/{id}/update
    /api/address/{id}/delete
    File Downloads
    /download/invoice_{id}.pdf
    /static/receipts/{id}.pdf
    /uploads/documents/{filename}
    /files/reports/report_{date}_{id}.xlsx
    Query Parameters
    ?userId=123
    ?orderId=456
    ?documentId=789
    ?file=report_123.pdf
    ?account=user@email.com

    Quick Reference

    IDOR Testing Checklist

    TestMethodIndicator of Vulnerability
    Increment/Decrement IDChange id=5 to id=4Returns different user's data
    Use Victim's IDReplace with known victim IDAccess granted to victim's resources
    Enumerate RangeTest IDs 1-1000Find valid records of other users
    Negative ValuesTest id=-1 or id=0Unexpected data or errors
    Large ValuesTest id=99999999System information disclosure
    String IDsChange format id=user_123Logic bypass
    GUID ManipulationModify UUID portionsPredictable UUID patterns

    Response Analysis

    Status CodeInterpretation
    200 OKPotential IDOR - verify data ownership
    403 ForbiddenAccess control working
    404 Not FoundResource doesn't exist
    401 UnauthorizedAuthentication required
    500 ErrorPotential input validation issue

    Common Vulnerable Parameters

    Parameter TypeExamples
    User identifiersuserId, uid, user_id, account
    Resource identifiersid, pid, docId, fileId
    Order/TransactionorderId, transactionId, invoiceId
    Message/CommunicationmessageId, threadId, chatId
    File referencesfilename, file, document, path

    Constraints and Limitations

    Operational Boundaries

  • Requires at least two valid user accounts for verification
  • Some applications use session-bound tokens instead of IDs
  • GUID/UUID references harder to enumerate but not impossible
  • Rate limiting may restrict enumeration attempts
  • Some IDOR requires chained vulnerabilities to exploit
  • Detection Challenges

  • Horizontal privilege escalation (user-to-user) vs vertical (user-to-admin)
  • Blind IDOR where response doesn't confirm access
  • Time-based IDOR in asynchronous operations
  • IDOR in websocket communications
  • Only test applications with explicit authorization
  • Document all testing activities and findings
  • Do not access, modify, or exfiltrate real user data
  • Report findings through proper disclosure channels
  • Examples

    Example 1: Basic ID Parameter IDOR

    # Login as attacker (userId=1001)
    # Navigate to profile page
    
    # Original request
    GET /api/profile?id=1001 HTTP/1.1
    Cookie: session=abc123
    
    # Response: Attacker's profile data
    
    # Modified request (targeting victim userId=1000)
    GET /api/profile?id=1000 HTTP/1.1
    Cookie: session=abc123
    
    # Vulnerable Response: Victim's profile data returned!

    Example 2: IDOR in Address Update Endpoint

    # Intercept address update request
    PUT /api/addresses/5/update HTTP/1.1
    Content-Type: application/json
    Cookie: session=attacker_session
    
    {
      "id": 5,
      "userId": 1001,
      "street": "123 Main St",
      "city": "Test City"
    }
    
    # Modify userId to victim's ID
    {
      "id": 5,
      "userId": 1000,  # Changed from 1001
      "street": "Hacked Address",
      "city": "Exploit City"
    }
    
    # If 200 OK: Address created under victim's account

    Example 3: Static File IDOR

    # Download own receipt
    GET /api/download/5 HTTP/1.1
    Cookie: session=attacker_session
    
    # Response: PDF of attacker's receipt (order #5)
    
    # Attempt to access other receipts
    GET /api/download/3 HTTP/1.1
    Cookie: session=attacker_session
    
    # Vulnerable Response: PDF of victim's receipt (order #3)!

    Example 4: Burp Intruder Enumeration

    # Configure Intruder attack
    Target: PUT /api/addresses/§1§/update
    Payload Position: Address ID in URL and body
    
    Attack Configuration:
    - Type: Battering Ram
    - Payload: Numbers 0-20, Step 1
    
    Body Template:
    {
      "id": §1§,
      "userId": 3
    }
    
    # Analyze results:
    # - 200 responses indicate successful modification
    # - Check victim's account for new addresses

    Example 5: Horizontal to Vertical Escalation

    # Step 1: Enumerate user roles
    GET /api/user/1 → {"role": "user", "id": 1}
    GET /api/user/2 → {"role": "user", "id": 2}
    GET /api/user/3 → {"role": "admin", "id": 3}
    
    # Step 2: Access admin functions with discovered ID
    GET /api/admin/dashboard?userId=3 HTTP/1.1
    Cookie: session=regular_user_session
    
    # If accessible: Vertical privilege escalation achieved

    Troubleshooting

    Issue: All Requests Return 403 Forbidden

    Cause: Server-side access control is implemented

    Solution:

    # Try alternative attack vectors:
    1. HTTP method switching (GET → POST → PUT)
    2. Add X-Original-URL or X-Rewrite-URL headers
    3. Try parameter pollution: ?id=1001&id=1000
    4. URL encoding variations: %31%30%30%30 for "1000"
    5. Case variations for string IDs

    Issue: Application Uses UUIDs Instead of Sequential IDs

    Cause: Randomized identifiers reduce enumeration risk

    Solution:

    # UUID discovery techniques:
    1. Check response bodies for leaked UUIDs
    2. Search JavaScript files for hardcoded UUIDs
    3. Check API responses that list multiple objects
    4. Look for UUID patterns in error messages
    5. Try UUID v1 (time-based) prediction if applicable

    Issue: Session Token Bound to User

    Cause: Application validates session against requested resource

    Solution:

    # Advanced bypass attempts:
    1. Test for IDOR in unauthenticated endpoints
    2. Check password reset/email verification flows
    3. Look for IDOR in file upload/download
    4. Test API versioning: /api/v1/ vs /api/v2/
    5. Check mobile API endpoints (often less protected)

    Issue: Rate Limiting Blocks Enumeration

    Cause: Application implements request throttling

    Solution:

    # Bypass techniques:
    1. Add delays between requests (Burp Intruder throttle)
    2. Rotate IP addresses (proxy chains)
    3. Target specific high-value IDs instead of full range
    4. Use different endpoints for same resources
    5. Test during off-peak hours

    Issue: Cannot Verify IDOR Impact

    Cause: Response doesn't clearly indicate data ownership

    Solution:

    # Verification methods:
    1. Create unique identifiable data in victim account
    2. Look for PII markers (name, email) in responses
    3. Compare response lengths between users
    4. Check for timing differences in responses
    5. Use secondary indicators (creation dates, metadata)

    Remediation Guidance

    Implement Proper Access Control

    pythoncode
    # Django example - validate ownership
    def update_address(request, address_id):
        address = Address.objects.get(id=address_id)
        
        # Verify ownership before allowing update
        if address.user != request.user:
            return HttpResponseForbidden("Unauthorized")
        
        # Proceed with update
        address.update(request.data)

    Use Indirect References

    pythoncode
    # Instead of: /api/address/123
    # Use: /api/address/current-user/billing
    
    def get_address(request):
        # Always filter by authenticated user
        address = Address.objects.filter(user=request.user).first()
        return address

    Server-Side Validation

    pythoncode
    # Always validate on server, never trust client input
    def download_receipt(request, receipt_id):
        receipt = Receipt.objects.filter(
            id=receipt_id,
            user=request.user  # Critical: filter by current user
        ).first()
        
        if not receipt:
            return HttpResponseNotFound()
        
        return FileResponse(receipt.file)

    How to Use & Getting Started

    Protected

    # Step 1: Initialize skill agent setup

    npx skills add Idor Testing --install-production

    python -m pip install -r requirements.txt

    codex plugin install Idor Testing@latest

    export API_KEY=secret_token_key_here

    Installation Runbook & Walkthrough Locked

    Unlock this skill to reveal complete step-by-step setup guides, terminal commands, configuration recipes, repository links, and interactive installation video walkthroughs.

    Unlock full access to Idor Testing

    Get instant access to complete setup guides, repository source code, and integration assets.