OWASP & AppSec

Vulnérabilité IDOR : définition, exemples et prévention 2026

Qu'est-ce qu'une vulnérabilité IDOR ? Définition, exemples concrets, classification OWASP Top 10 A01, impact business et bonnes pratiques de prévention.

Naim Aouaichia
12 min de lecture
  • IDOR
  • Vulnérabilité web
  • OWASP
  • OWASP Top 10
  • Broken Access Control
  • Autorisation
  • BOLA
  • API Security
  • AppSec
  • Secure coding
  • CWE-639
  • Pentest web
  • Vocabulaire AppSec
  • Définition

Une vulnérabilité IDOR (Insecure Direct Object Reference) est une faille de sécurité applicative où un programme expose côté client des identifiants d'objets internes (ID base de données, nom de fichier, clé de ressource) sans vérifier systématiquement que l'utilisateur authentifié a le droit d'accéder à l'objet référencé. Elle fait partie de la famille Broken Access Control, classée A01:2021 dans OWASP Top 10 (position n°1 des risques applicatifs depuis 2021) et API1:2023 BOLA dans OWASP API Security Top 10. Techniquement classifiée sous CWE-639 (Authorization Bypass Through User-Controlled Key), elle reste en 2026 la vulnérabilité la plus fréquemment rapportée en bug bounty et la plus impactante en fuite de données. Cet article détaille la définition précise, les trois types d'IDOR, les exemples concrets en code, les incidents majeurs, les méthodes de détection et les stratégies de prévention.

Qu'est-ce qu'une IDOR exactement

Une IDOR survient quand trois conditions sont réunies :

  1. L'application expose côté client un identifiant qui référence un objet interne (un entier, une chaîne, un UUID, un nom de fichier).
  2. Cet identifiant est manipulable par un utilisateur authentifié — typiquement dans une URL, un paramètre de requête, un corps JSON ou un en-tête.
  3. Le serveur ne vérifie pas, ou vérifie incorrectement, que l'utilisateur authentifié a le droit d'accéder à cet objet spécifique.

Conséquence : un utilisateur authentifié mais non autorisé accède, modifie ou supprime des données qui appartiennent à un autre utilisateur ou à un autre périmètre (autre tenant, autre organisation, autre client).

Distinction importante avec les autres familles de vulnérabilités

FamilleMécanismeExemple
IDOR / Broken Access Control (A01)Référence directe à un objet sans vérif d'autorisation/orders/456 accessible à un autre user
Injection (A03)Exécution de code ou requête via entrée utilisateur?id=1 OR 1=1
Auth Failure (A07)Défaut dans le processus d'authentificationPassword brute force, MFA bypass
Security Misconfig (A05)Configuration serveur ou framework par défautDirectory listing activé
SSRF (A10)Le serveur effectue des requêtes vers des cibles contrôlées?url=http://169.254.169.254/

Les trois types d'IDOR

La littérature OWASP distingue trois grands patterns d'IDOR, qui peuvent se combiner dans une même application.

IDOR horizontale

L'utilisateur authentifié accède à des ressources d'un autre utilisateur du même niveau de privilège. Exemple : le compte A accède aux commandes du compte B en modifiant /orders/123 en /orders/124. C'est le pattern le plus fréquent en bug bounty et le plus simple à démontrer.

IDOR verticale

L'utilisateur accède à des ressources normalement réservées à un rôle supérieur. Exemple : un utilisateur standard accède à /admin/users/456 ou exécute DELETE /api/tenant-settings/789 via manipulation d'ID, là où seul un administrateur devrait pouvoir le faire. Souvent combinée avec d'autres défauts (route admin accessible sans vérification de rôle).

IDOR à référence directe de fichier ou de ressource externe

L'identifiant est un nom de fichier, une clé S3, un chemin, une URL. Exemple : /download?file=invoice_2024_00123.pdf où l'utilisateur devine les noms des factures d'autres clients par incrémentation ou pattern.

Comment fonctionne une IDOR : mécanismes techniques

Le mécanisme type suit un scénario classique en 5 étapes.

  1. Observation : l'attaquant identifie un endpoint qui manipule un objet via un identifiant (/api/users/:id, /documents/:docId).
  2. Format identification : il analyse le format de l'ID (entier séquentiel, UUID, chaîne base64, hash, composite).
  3. Manipulation : il substitue son ID par celui d'un autre utilisateur, soit via énumération (entiers séquentiels), soit via fuite (URLs partagées, logs, références externes).
  4. Rejeu authentifié : il rejoue la requête avec ses propres cookies/tokens de session.
  5. Validation : si la réponse HTTP 200 contient les données cibles, l'IDOR est confirmée.
// Exemple type : API Express vulnérable vs sécurisée
 
// INSECURE — aucun contrôle d'autorisation, IDOR triviale
app.get('/api/orders/:orderId', authenticate, async (req, res) => {
  const order = await db.orders.findById(req.params.orderId);
  if (!order) return res.status(404).json({ error: 'Not found' });
  return res.json(order);
});
 
// SECURE — contrôle d'autorisation au niveau objet
app.get('/api/orders/:orderId', authenticate, async (req, res) => {
  const order = await db.orders.findById(req.params.orderId);
  if (!order) return res.status(404).json({ error: 'Not found' });
 
  // Contrôle de propriété : utilisateur propriétaire OU admin autorisé
  const canAccess =
    order.userId === req.user.id ||
    req.user.roles.includes('admin:orders');
 
  if (!canAccess) {
    logger.warn('unauthorized order access attempt', {
      userId: req.user.id,
      targetOrderId: req.params.orderId,
    });
    // Retourner 404 et non 403 : éviter la fuite d'existence de l'objet
    return res.status(404).json({ error: 'Not found' });
  }
 
  return res.json(order);
});

IDOR vs BOLA : la version API

Avec la bascule massive vers les architectures API-first depuis 2018, l'OWASP a publié un référentiel dédié aux API (OWASP API Security Top 10). L'équivalent direct de l'IDOR y figure sous l'identifiant API1:2023 BOLA (Broken Object Level Authorization), position n°1 du Top 10 API depuis sa création.

CaractéristiqueIDOR (web classique)BOLA (API)
RéférentielOWASP Top 10 A01:2021OWASP API Security Top 10 API1:2023
Exemple de vecteurURL /orders/123, formulaire cachéJSON body, URL param, header custom
Contexte typiqueWeb app rendu côté serveurREST, GraphQL, gRPC, WebSocket
DétectionBurp Suite, Autorize extensionPostman + script, Bruno, custom scanner
ParticularitéSouvent un seul endpointMultiplication massive d'endpoints à tester

La fréquence BOLA en API est significativement plus élevée qu'en web classique : selon Salt Security API Security Report 2024, 30 à 40 % des vulnérabilités critiques trouvées sur des API exposées sont des BOLA. La cause principale : la multiplicité des endpoints d'API modernes (50-500 endpoints par application moyenne) vs l'application web monolithique historique (20-50 endpoints), et la tentation du « chaque microservice gère son propre contrôle d'accès » qui multiplie les points de défaillance.

Classification OWASP, CWE et CVE notables

Référentiels de classification à connaître en 2026

RéférentielIdentifiantDescription
OWASP Top 10 2021A01:2021Broken Access Control
OWASP API Security Top 10 2023API1:2023Broken Object Level Authorization (BOLA)
OWASP WSTG v4.2WSTG-ATHZ-04Testing for Insecure Direct Object References
OWASP ASVS v4V4.2.1, V4.2.2Access control object-level verification
CWE-639Authorization Bypass Through User-Controlled Key
CWE-285Improper Authorization
CWE-284Improper Access Control
CAPEC-114Authentication Abuse

CVE IDOR publiques notables (2019-2024)

  • CVE-2019-5418 (Ruby on Rails) : Directory Traversal via ActionView, combinaison IDOR + path traversal.
  • CVE-2020-11108 (Pi-hole) : IDOR dans l'interface admin permettant RCE.
  • CVE-2021-44228 n'est pas une IDOR mais cohabite historiquement dans les rapports post-Log4Shell avec des chaînages IDOR pour compléter l'impact.
  • CVE-2022-24637 (Open Web Analytics) : IDOR permettant la prise de contrôle admin.
  • CVE-2023-37611 (WP Webhooks) : IDOR dans plugin WordPress très utilisé.

Impact business et incidents majeurs

L'impact d'une IDOR dépasse souvent la simple exposition technique. Quelques incidents publics emblématiques.

First American Financial Corp (2019) — Vulnérabilité IDOR dans l'application EagleProNetwork qui exposait 885 millions de documents financiers clients (titres de propriété, transactions hypothécaires, numéros de sécurité sociale) sur une simple manipulation d'ID numérique séquentiel dans l'URL. Amende SEC 487 000 USD en 2021 ; réforme complète du programme AppSec imposée.

T-Mobile (2018) — Vulnérabilité IDOR dans l'API du portail client exposant numéros de téléphone, e-mails, IMSI, numéros de compte de 2 millions d'utilisateurs via manipulation d'ID numérique.

USPS Informed Visibility (2018) — IDOR dans l'API de suivi postal exposant les données de 60 millions de comptes, découverte par un chercheur indépendant, correction en 12 mois.

Parler (janvier 2021) — Extraction massive de posts utilisateurs via IDOR sur IDs séquentiels combinée à une absence de rate limiting. Des téraoctets de contenu public extraits archivables avant la fermeture de la plateforme.

Facebook Phone Number Lookup (2019) — IDOR dans une API de recherche d'utilisateur par numéro de téléphone exposant 419 millions d'enregistrements avant correction.

Ces incidents partagent trois signaux communs : IDs numériques séquentiels, absence totale ou partielle de contrôle d'accès au niveau objet, absence de rate limiting qui aurait réduit l'exploitation massive.

Comment tester et détecter

La détection d'IDOR combine tests manuels et outils spécialisés.

Procédure de test manuel en 4 étapes

  1. Provisionner deux comptes utilisateurs distincts (A et B) avec des données identifiables.
  2. Cartographier tous les endpoints qui manipulent un identifiant côté URL, paramètre, corps JSON ou en-tête. Inclure GET, POST, PATCH, PUT, DELETE.
  3. Capturer les requêtes authentifiées du compte A et substituer ses IDs par ceux du compte B tout en conservant sa propre session.
  4. Comparer les réponses : HTTP 200 avec données de B = IDOR confirmée, 403/404 = contrôle probablement correct (à vérifier dans les logs serveur).

Outils spécialisés en 2026

OutilFonction
Burp Suite Pro + Autorize extensionComparaison automatique multi-session, marquage des requêtes vulnérables
Burp Suite Pro + AuthMatrix extensionMatrice complète rôle × endpoint
Burp IntruderFuzzing de plages d'IDs numériques
Caido (alternative moderne Burp)Workflow d'autorisation intégré
Postman + NewmanTests d'API automatisés avec assertions
BrunoAlternative open-source à Postman
ffuf / wfuzzÉnumération d'IDs à haute vitesse
OWASP ZAP + Add-on AuthorizationScan automatique authorization

Points de test souvent oubliés

  • Opérations non-GET (PATCH, PUT, DELETE) : la plupart des test se concentrent sur les GET.
  • IDs dans les en-têtes customs (X-Tenant-Id, X-User-Context) et non seulement dans l'URL.
  • IDs dans les bodies JSON imbriqués ({ "order": { "id": 123, "userId": 456 } }).
  • GraphQL : les IDs passent dans les variables et les queries, tester chaque mutation séparément.
  • WebSocket : souvent oublié, messages authentifiés manipulables.
  • Query parameters cachés ou découverts via Arjun/Param Miner.

Comment prévenir efficacement

Une défense robuste contre l'IDOR repose sur quatre lignes de défense, à implémenter toutes ensemble.

1. Contrôle d'accès centralisé au niveau objet

Une seule fonction canAccess(user, resource, action) appelée systématiquement avant chaque opération, basée sur la relation de propriété, le rôle et le tenant.

# Pattern de contrôle d'accès centralisé en Python
from functools import wraps
from flask import abort, g, request
 
def authorize(resource_type: str, action: str):
    """Décorateur de contrôle d'accès, appelé sur chaque route sensible."""
    def decorator(func):
        @wraps(func)
        def wrapped(*args, **kwargs):
            resource_id = kwargs.get("resource_id") or request.view_args.get("id")
            resource = load_resource(resource_type, resource_id)
            if not resource:
                abort(404)
            if not can_access(g.current_user, resource, action):
                # Log pour SIEM + retour 404 pour éviter la fuite d'existence
                audit_log("unauthorized_access", g.current_user.id, resource_type, resource_id)
                abort(404)
            return func(*args, **kwargs)
        return wrapped
    return decorator
 
@app.route("/api/orders/<order_id>", methods=["GET"])
@authorize("order", "read")
def get_order(order_id):
    return jsonify(load_resource("order", order_id).to_dict())

2. Identifiants non prédictibles (défense complémentaire)

  • Préférer UUID v4 aux IDs séquentiels pour les ressources utilisateur.
  • Pour les URLs publiques partageables, utiliser des tokens de ressource chiffrés (JWE) avec durée de vie.
  • Les UUID réduisent la surface d'énumération mais ne remplacent pas un contrôle d'autorisation.

3. Références indirectes

Dans les contextes à forte sensibilité, exposer côté client un identifiant de session éphémère (reference_key) mappé côté serveur vers l'objet réel. Pattern documenté dans OWASP ASVS V4.2.

4. Tests automatisés d'autorisation

  • Tests d'intégration CI : scénarios explicites avec 2 utilisateurs testant chaque endpoint.
  • Tests de régression à chaque modification de route ou de service.
  • Pentest manuel annuel complémentaire pour les cas de logique métier.
  • Bug bounty en production pour les cas non couverts par tests internes.

Points clés à retenir

  • Définition : exposition d'identifiant d'objet + manipulation possible + absence de vérification d'autorisation au niveau objet.
  • Classification 2026 : OWASP Top 10 A01:2021 (Broken Access Control) / OWASP API Security Top 10 API1:2023 (BOLA) / CWE-639 / WSTG-ATHZ-04.
  • Trois types : IDOR horizontale (même niveau utilisateur), verticale (élévation privilège), référence fichier/ressource.
  • Fréquence : première cause de vulnérabilités critiques en API (30-40 % selon Salt Security 2024), 94 % des apps ont au moins un défaut Broken Access Control (OWASP).
  • Détection : 2 comptes + Burp Autorize / AuthMatrix + tests sur toutes méthodes HTTP + endpoints API et WebSocket inclus.
  • Prévention : contrôle d'accès centralisé canAccess(user, resource, action) + UUID non prédictibles + tests d'intégration CI + bug bounty en production.
  • Réponse HTTP : privilégier 404 plutôt que 403 pour éviter la fuite d'existence d'objet.
  • Incidents majeurs : First American (885M), T-Mobile (2M), USPS (60M), Facebook Phone Lookup (419M) — tous partagent IDs séquentiels + absence de contrôle objet.

Pour aller plus loin

Questions fréquentes

  • Quelle est la différence entre IDOR et BOLA ?
    IDOR (Insecure Direct Object Reference) est le terme historique OWASP désignant une vulnérabilité où une application expose des identifiants d'objets internes (ID de base, nom de fichier, clé) et ne vérifie pas que l'utilisateur authentifié a le droit d'accéder à l'objet référencé. BOLA (Broken Object Level Authorization) est la dénomination OWASP API Security Top 10 2023 (API1) qui couvre exactement le même mécanisme de défaut côté API. Les deux termes sont techniquement équivalents : BOLA est la version « API first » d'IDOR. En 2026, BOLA reste la vulnérabilité API la plus fréquente selon les rapports Salt Security et Traceable, représentant 30 à 40 % des vulnérabilités critiques identifiées en pentest API. Dans un rapport de pentest professionnel, on cite typiquement les deux classifications (IDOR pour web classique, BOLA pour API) avec le même CWE sous-jacent (CWE-639, CWE-285, CWE-284).
  • Quelle est la classification OWASP et CWE d'une IDOR ?
    Une IDOR est catégorisée dans OWASP Top 10 2021 sous A01:2021 Broken Access Control, qui est devenue la catégorie numéro 1 des risques applicatifs depuis la révision 2021 (auparavant #5 en 2017). Dans l'OWASP API Security Top 10 2023, elle correspond à API1 BOLA (Broken Object Level Authorization). Côté taxonomie CWE de MITRE, les principaux identifiants associés sont CWE-639 (Authorization Bypass Through User-Controlled Key), CWE-285 (Improper Authorization), CWE-284 (Improper Access Control) pour les cas plus généraux, CWE-566 (Authorization Bypass Through SQL-based Manipulation) en contexte SQL. En OWASP WSTG v4.2, les tests spécifiques sont WSTG-ATHZ-04 (Testing for Insecure Direct Object References). En OWASP ASVS v4, les exigences V4.2.1 et V4.2.2 couvrent explicitement les contrôles d'accès au niveau objet.
  • Comment détecter une IDOR en pentest ou bug bounty ?
    Méthode standard en 4 étapes. 1) Créer 2 comptes utilisateurs distincts sur l'application cible. 2) Se connecter avec le compte A, identifier toutes les opérations qui manipulent un identifiant côté URL, corps de requête ou header (/orders/123, /users/456, /documents/abc-def-ghi). 3) Depuis la session du compte B, rejouer chaque requête en substituant les IDs par ceux observés depuis le compte A. 4) Comparer les réponses : accès accordé = IDOR confirmée, accès refusé = contrôle présent. Outils accélérateurs : extensions Burp Suite Autorize (comparaison automatique multi-session) et AuthMatrix (matrice rôle × endpoint), Burp Intruder pour fuzzer des plages d'IDs. Points de test souvent oubliés : opérations PATCH/PUT/DELETE (pas uniquement GET), champs cachés dans le corps JSON (owner_id, tenant_id), paramètres dans headers customs, WebSocket messages.
  • Quels sont les cas d'IDOR les plus critiques en entreprise ?
    Quatre patterns concentrent 80 % des IDOR à fort impact observées en pentest et bug bounty 2023-2025. 1) API de consultation massive /api/orders/:id avec IDs séquentiels : une simple boucle extrait toutes les commandes clients. 2) Reset password avec ID utilisateur dans le corps /api/password-reset { userId: 12345 } sans vérification de propriété du token. 3) Multi-tenancy SaaS où tenantId peut être manipulé dans les en-têtes ou le JWT : accès transverse aux données d'autres clients. 4) Téléchargement de fichiers /downloads/invoice_2024_123.pdf où l'ID est prédictible : fuite de documents contractuels. Les incidents réels les plus cités : First American (2019, 885 millions de documents clients exposés via IDOR), T-Mobile (2018, 2 millions d'enregistrements via API IDOR), USPS Informed Visibility (2018, 60 millions de comptes), Parler (janvier 2021, extraction massive via IDOR sur posts ID séquentiels).
  • Comment prévenir efficacement les IDOR dans une application ?
    Quatre lignes de défense en profondeur, à implémenter toutes ensemble. 1) Contrôle d'accès centralisé : une seule fonction canAccess(user, resource) appelée systématiquement avant chaque opération, basée sur la relation de propriété et le rôle. 2) Identifiants non prédictibles : UUID v4 ou identifiants chiffrés (JWE), jamais d'IDs séquentiels pour les ressources utilisateur. Cela réduit la surface d'exploitation mais ne constitue pas un contrôle de sécurité à lui seul. 3) Références indirectes : exposer côté client un identifiant de session temporaire (reference_key) pointant vers l'objet réel côté serveur, plutôt que l'ID base de données directement. 4) Tests automatisés : tests d'intégration qui créent 2 utilisateurs et vérifient que chaque endpoint respecte l'isolation. À compléter par un pentest manuel annuel et un programme bug bounty pour détecter les cas de logique métier non couverts par les tests.
  • L'OWASP Top 10 A01 Broken Access Control couvre-t-il autre chose que les IDOR ?
    Oui, largement. A01:2021 Broken Access Control regroupe toutes les défaillances de contrôle d'accès, dont les IDOR ne sont qu'une sous-catégorie. Autres défauts couverts par A01 : élévation de privilèges verticale (utilisateur standard exécutant une action admin), force browsing (accès à des URLs administratives non liées mais accessibles), CORS mal configuré permettant des requêtes cross-origin non autorisées, contournement de contrôle d'accès via modification de méthode HTTP, manipulation de JWT (algorithme none, key confusion), IDs dans tokens non validés, listing de fichiers dans services cloud (S3 buckets publics). Selon OWASP, 94 % des applications testées présentent au moins une vulnérabilité dans A01. L'IDOR reste toutefois la forme la plus fréquente et la plus exploitée en bug bounty 2024-2025.

Écrit par

Naim Aouaichia

Expert cybersécurité et fondateur de Zeroday Cyber Academy

Expert cybersécurité avec un master spécialisé et un parcours hybride : développement, DevOps, DevSecOps, SOC, GRC. Fondateur de Hash24Security et Zeroday Cyber Academy. Formateur et créateur de contenu technique sur la cybersécurité appliquée, la sécurité des LLM et le DevSecOps.