Synthèse automatique
Ce skill guide la recherche de vulnérabilités de type Broken Object Level Authorization (BOLA/IDOR) dans les API et applications web, en rejouant les requêtes d'un compte victime avec le jeton d'un compte attaquant.
Points forts
- Méthodologie structurée en dix étapes couvrant le mapping des identifiants, les tests non authentifiés, les écritures (PUT/PATCH/DELETE) et les IDOR de second ordre
- Fournit des charges utiles concrètes prêtes à l'emploi : ffuf sur des plages d'ID numériques, curl avec échange d'ID, suffixes .json, versions d'API obsolètes et « JSON globbing »
- S'appuie sur des références reconnues (WSTG-ATHZ-04 de l'OWASP) et recommande l'extension Autorize de Burp Suite
- Liste des signaux d'alerte précis (paramètres user_id/owner_id, alias « me », liens de partage, endpoints d'export) qui aident à cibler rapidement les points d'entrée
Limites
- Le document fourni est tronqué à la description de l'extension Autorize, qui s'arrête en pleine phrase
- Suppose deux comptes de test isolés et un périmètre d'autorisation explicite : inutilisable sur une cible sans permission écrite
- Ne couvre pas les cas d'autorisation au niveau des propriétés (BOPLA) ni les aspects de correction/remédiation
À utiliser lors d'un test d'intrusion autorisé sur une API ou une application web où des identifiants d'objets (numériques, UUID) circulent dans les URL, les corps de requête ou les cookies.
À éviter sur tout système dont vous n'avez pas l'autorisation écrite de tester, ou lorsque la cible est une API sans objet adressable par identifiant client.
Analyse de sécurité
PrudenceThis is a conventional BOLA/IDOR testing methodology derived from OWASP WSTG-ATHZ-04. It declares no tools and contains no destructive, exfiltrating, or obfuscated actions; every command targets a user-supplied TARGET with user-supplied tokens. The only risk is inherent dual-use: it enables active probing and access-control bypass attempts against live APIs, which is legitimate only under authorized testing. Hence 'caution' rather than 'safe', and clearly not 'risky'.
- •Includes commands (curl, ffuf, Burp Intruder/Autorize) that send live authenticated requests to target systems; safe only when the user has explicit authorization to test the target
- •Payload guidance (ID fuzzing, HTTP verb swapping, JSON globbing, path traversal, second-order async abuse) is dual-use offensive technique, though scoped to authorized pentesting and contains no destructive or exfiltrating automation
- •No credential, token, or secret handling; tokens are placeholders (YOUR_TOKEN) and no data is sent to third parties
- •No obfuscated payloads, no curl|sh, no rm -rf, no safety-disabling instructions
Exemples
I have written authorization to test https://api.example.com. I created two accounts, attacker_a and victim_b, and captured victim_b's requests in Burp. Help me test /api/orders/{id} and /api/users/{id}/profile for BOLA, including write operations and unauthenticated requests.My own order ID is 1042 and I'm authenticated with a bearer token. Give me an ffuf command to fuzz IDs 1000-2000 on /api/receipts/FUZZ and explain how to filter false positives from the response sizes.Walk me through testing second-order IDOR via a scheduled export job that references a victim's invoice ID in the request body, and check whether /v1/ endpoints still accept the swapped ID.name: bola-idor description: > Use when hunting Broken Object Level Authorization (BOLA) or Insecure Direct Object Reference (IDOR) vulnerabilities in APIs or web applications. Trigger on: "BOLA", "IDOR", "broken object level", "access other users", "object reference", numeric or UUID IDs in URLs or request bodies, user-scoped resources, horizontal privilege escalation, "change the ID in the request", second-order IDOR, blind IDOR, indirect reference, encoded ID, deprecated API version, JSON globbing. license: MIT compatibility: Designed for Claude Code. Burp Suite (Autorize extension) or curl recommended. metadata: category: authorization version: "0.2" source: https://owasp.org/www-project-web-security-testing-guide/stable/ source_types: framework wstg: WSTG-ATHZ-04
Broken Object Level Authorization (BOLA / IDOR)
What Is Broken and Why
The server accepts a resource identifier from the client and fetches the object without verifying the requesting user owns or has access to it. Authorization is enforced at the route level ("is this user logged in?") but not at the object level ("does this user own object 1042?"). An attacker substitutes their identifier for a victim's to read, modify, or delete resources they should never access. BOLA is consistently the #1 OWASP API Security risk because it is trivial to test and almost always yields high-severity findings.
Key Signals
- Numeric or sequential IDs in URL path:
/api/orders/1042,/users/7/profile - UUIDs or hashes in query params or body referencing another user's object
- Parameters named
user_id,account_id,owner_id,ref,target_id,invoice - Write operations (PUT/PATCH/DELETE) accepting an object ID
- Export/download/share endpoints with a resource ID parameter
- Keywords
meorcurrentused as ID aliases — swappable for integer IDs - Older API versions still accessible:
/v1/,/v2/,/legacy/ - UUIDs discoverable via public profiles, share links, password reset flows, Wayback Machine
Methodology
- Map all object identifiers across the entire app — URLs, query params, request body, cookies, headers.
- Create two accounts with distinctive names (e.g.
attacker_a,victim_b). Use separate browsers to keep sessions fully isolated. Fully populate the victim account with varied resources and document all encountered IDs. Capture all requests with the victim session. - Replay each request using the attacker token with the victim's object IDs.
- Compare responses — same data returned = BOLA confirmed.
- Test unauthenticated: remove
Authorizationheader entirely. - Test write operations (PUT/PATCH/DELETE) — impact is higher than reads.
- Test indirect references: export endpoints, share links, scheduled jobs, email triggers.
- Test less-visible features: auto-save, draft, notification, audit log, attachment endpoints.
- Try older API versions (
/v1/,/beta/) which often lack access control patches. - For second-order IDOR: store a payload referencing victim's ID, trigger async processing, observe outcome.
Payloads & Tools
# ffuf: fuzz numeric IDs around your own
ffuf -w <(seq 1000 2000) -u https://TARGET/api/users/FUZZ \
-H "Authorization: Bearer YOUR_TOKEN" -mc 200 -fs 0
# curl: direct ID swap
curl -s https://TARGET/api/orders/VICTIM_ID \
-H "Authorization: Bearer YOUR_TOKEN"
# Append .json to bypass access control
curl https://TARGET/api/receipts/VICTIM_ID.json \
-H "Authorization: Bearer YOUR_TOKEN"
# Try deprecated API version
curl https://TARGET/v1/users/VICTIM_ID \
-H "Authorization: Bearer YOUR_TOKEN"
# Burp Intruder: fuzz ±1000 around your own ID
GET /api/orders/§1042§ HTTP/1.1
Authorization: Bearer YOUR_TOKEN
# JSON globbing in request body
{"user_id": [YOUR_ID, VICTIM_ID]}
{"user_id": "*"}
{"user_id": true}
{"user_id": 0}
{"user_id": -1}
{"user_id": 1235.0}
Burp extension: Autorize — automatically replaces session token with low-priv token on every request, flags unexpected 200s and response diffs.
Bypass Techniques
- JSON globbing: replace ID with
[id1, id2],*,true,0,-1,1234.0— parsers may match all - HTTP verb swap: GET blocked → try POST, PUT, DELETE, PATCH on same path
- Parameter pollution:
?user_id=YOURS&user_id=VICTIM— server may process last or first - Encoded references: base64/hex decode the ID, increment, re-encode — app trusts encoding as security
- Alternate field names:
owner_id,account_id,ref,target,resource_id,parent_id - Path traversal:
/api/users/YOURS/../VICTIM - Static keyword swap: replace
meorcurrentwith a numeric ID - Content-type switch: JSON endpoint may behave differently with
application/x-www-form-urlencoded - Second-order: store a reference to victim's ID in a field, trigger async job that processes it without re-checking auth
- Append extension:
/resource/VICTIM_ID.json,.xml,.csvmay skip access control middleware
Exploitation Scenarios
Scenario 1 — Account takeover via email change
Setup: PUT /api/users/{id} accepts email as an editable field, no ownership check.
Trigger: Attacker replaces their own id with victim's id in the request body.
Impact: Victim's email changed to attacker's address → password reset → full account takeover.
Scenario 2 — Mass PII leak via sequential ID
Setup: /api/orders/{id} returns full order: name, address, card last4, phone.
Trigger: Attacker iterates integer IDs from 1 to N with their own session token.
Impact: Thousands of customers' PII and payment metadata exfiltrated via scripted enumeration.
Scenario 3 — Second-order IDOR via scheduled export
Setup: App lets users schedule data exports; export job runs async and emails result.
Trigger: Attacker sets export_for_user_id=VICTIM_ID in the schedule request.
Impact: Victim's full data export emailed to attacker — no access control on the async job.
False Positives
- API returns 200 but with empty or redacted data — access control is working, just silent
- Public resources (product listings, public profiles) — no authorization expected by design
- Response identical regardless of ID — server reads from session context, ID param is ignored
meandcurrentaliases that correctly resolve to the authenticated user only
Fix Patterns
-- Correct: ownership enforced at query level
SELECT * FROM orders WHERE id = ? AND user_id = current_user_id()
# Wrong: fetch then check (inefficient + race-prone)
order = db.find(id)
if order.user_id != current_user:
raise Forbidden()
# Correct: indirect reference map (never expose raw DB IDs)
user_resource_map = {session_token: [allowed_id_1, allowed_id_2]}
if requested_id not in user_resource_map[session_token]:
raise Forbidden()
- Use indirect reference maps: expose opaque tokens that map server-side to real IDs
- Centralize authorization in middleware — one place, not scattered per-route
- Apply access control consistently across ALL HTTP methods and API versions
- Disable or equally secure deprecated API versions
Related Skills
[[authz-bypass]] covers the broader authorization failure class — BOLA is its most common manifestation. When the application uses GraphQL, [[graphql-idor-via-introspection-leak]] shows how to enumerate the schema to find every object type accepting an ID argument. [[path-traversal]] is an IDOR on the filesystem: the same "reference to a resource without ownership check" pattern applied to file paths. IDOR findings frequently reveal [[business-logic-flaws]] — such as skipping payment by referencing another order's paid state.
Du fichier au premier essai
Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.
Consulter la source et ses fichiers annexesCe téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.
1. Télécharger le fichier
Télécharger SKILL.mdDepuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/broken-object-level-authorization-bola-idor-mrwakfou/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.
Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.
mkdir -p '.skill-downloads/broken-object-level-authorization-bola-idor-mrwakfou' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/broken-object-level-authorization-bola-idor-mrwakfou/download' --output '.skill-downloads/broken-object-level-authorization-bola-idor-mrwakfou/SKILL.md.part' && mv '.skill-downloads/broken-object-level-authorization-bola-idor-mrwakfou/SKILL.md.part' '.skill-downloads/broken-object-level-authorization-bola-idor-mrwakfou/SKILL.md'2. Vérifier les prérequis
Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.
Environnement déclaré par l’auteur : Designed for Claude Code. Burp Suite (Autorize extension) or curl recommended.
Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.
Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.
3. Charger la skill
Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.
Claude Code
test -f '.skill-downloads/broken-object-level-authorization-bola-idor-mrwakfou/SKILL.md' && test -s '.skill-downloads/broken-object-level-authorization-bola-idor-mrwakfou/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/bola-idor' && cp -R '.skill-downloads/broken-object-level-authorization-bola-idor-mrwakfou' '.claude/skills/bola-idor'OpenSkills
OpenSkills doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.
Installation officielle d’OpenSkillsopenskills install './.skill-downloads/broken-object-level-authorization-bola-idor-mrwakfou'openskills read 'broken-object-level-authorization-bola-idor-mrwakfou'La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.
Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.
openskills syncMode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.
4. Faire un premier essai
Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :
Lis .skill-downloads/broken-object-level-authorization-bola-idor-mrwakfou/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.
Sécurité AMM DeFi
Securite
Checklist de sécurité pour les contrats Solidity AMM, pools de liquidité et flux de swap. Couvre réentrance, attaques par donation, manipulation d'oracles, etc.
Créateur de règles Semgrep
Securite
Crée des règles Semgrep personnalisées pour détecter des vulnérabilités de sécurité, des motifs de bugs et des motifs de code. Inclut une méthodologie de test en premier, le support du mode taint et des étapes de validation. Utile pour construire des détections d'analyse statique ciblées.
Revue barre d'outils développement
Securite
Règles de sécurité pour la barre d'outils de développement, le client PostHog et les feature flags. À utiliser lors de la revue de modifications des composants dev-tools et connexes.