Le contrôle d'accès défaillant est la faille qui laisse une application faire ce qu'elle aurait dû empêcher : lire les données d'un autre utilisateur, atteindre une page d'administration jamais autorisée, ou modifier un enregistrement qui appartient à quelqu'un d'autre. Il occupe la première place de l'OWASP Top 10 parce qu'il est à la fois partout et facile à manquer. Le plus rapide pour le comprendre, c'est d'en casser un vous-même, alors ouvrez le lab IDOR Explorer de HackerDNA et changez un ou deux identifiants au fil de la lecture.
Ce risque a décroché la première place de l'OWASP Top 10 et l'a conservée dans l'édition 2025, qui y a même intégré le Server-Side Request Forgery comme sous-cas. Ce guide couvre ce qu'est le contrôle d'accès défaillant, les principaux types que vous rencontrerez (dont l'IDOR), le déroulement de l'attaque étape par étape, comment le tester, et comment le neutraliser dans votre propre code.
À retenir : le contrôle d'accès défaillant survient quand une application authentifie un utilisateur mais ne vérifie jamais s'il est autorisé pour l'action ou l'enregistrement précis qu'il demande. La forme la plus courante est l'IDOR : remplacez id=1043 par id=1044 et lisez la facture d'un inconnu. Le correctif n'est pas un meilleur filtre, c'est une vérification d'autorisation côté serveur sur chaque requête, liée à l'utilisateur connecté, avec un refus par défaut. On apprend à le repérer en l'exploitant, alors entraînez-vous dans un lab en navigateur avant de chercher à vous en défendre.
Qu'est-ce que le contrôle d'accès défaillant ?
Le contrôle d'accès défaillant est une vulnérabilité web où une application n'applique pas correctement ce qu'un utilisateur authentifié a le droit de voir ou de faire. L'utilisateur se connecte sans problème, mais l'application lui confie ensuite des données ou des actions qui devraient être restreintes, parce que la vérification d'autorisation est absente, faible ou appliquée au mauvais endroit.
La distinction clé oppose authentification et autorisation. L'authentification répond à « qui êtes-vous ? » et la plupart des applications y arrivent. L'autorisation répond à « avez-vous le droit de faire cette chose précise ? » et c'est là qu'elles échouent. Une application peut savoir exactement qui vous êtes et vous livrer quand même le tableau de bord d'administration, parce que personne n'a écrit la vérification qui dit que vous n'êtes pas administrateur.
C'est cet écart qui rend cette classe si fréquente. Les systèmes de connexion sont éprouvés par chaque développeur et chaque scanner. Les vérifications de permission par objet et par action sont éparpillées sur des centaines d'endpoints, et il suffit d'un seul endpoint qui a oublié de demander « cet enregistrement appartient-il à l'appelant ? » pour laisser fuir toute la table. Les données de l'OWASP le confirment : le contrôle d'accès défaillant a été trouvé dans plus d'applications testées que toute autre catégorie, ce qui explique précisément sa première place.
Où on le rencontre
- Références d'objets - des URL et des appels d'API qui portent un identifiant d'enregistrement (
/account?id=17) que le serveur accepte sans vérifier la propriété. - Fonctions d'administration et privilégiées - des endpoints de gestion qui reposent sur un lien caché plutôt que sur une vraie vérification de rôle.
- Endpoints d'API - des routes REST et GraphQL qui appliquent l'accès dans l'interface mais pas sur le serveur, si bien qu'une requête directe passe droit devant.
- Ressources statiques et internes - des fichiers, rapports et sauvegardes accessibles en devinant un chemin que le menu n'a jamais affiché.
Comment fonctionne une attaque par contrôle d'accès défaillant
Une attaque par contrôle d'accès défaillant a trois éléments mobiles : une session valide, une référence ou une action que vous n'êtes pas censé contrôler, et un serveur qui vérifie l'identité mais pas la permission. Le déroulé est court.
- Connectez-vous comme un utilisateur ordinaire. Il vous faut une session légitime pour atteindre les fonctions authentifiées. Ce n'est pas un contournement d'authentification, vous êtes un utilisateur normal qui abuse de ce qu'il peut déjà toucher.
- Trouvez une référence modifiable. Cherchez un identifiant, un nom d'utilisateur, un nom de fichier ou une valeur de rôle dans l'URL, un cookie, un champ de formulaire caché ou un corps JSON. Tout ce que le client envoie et sur quoi le serveur agit est un candidat.
- Modifiez-la et observez la réponse. Incrémentez l'identifiant, échangez votre nom d'utilisateur contre un autre, passez
role=useràrole=admin. Si le serveur renvoie des données ou exécute une action qui aurait dû être refusée, le contrôle d'accès est défaillant.
Prenons une application qui sert votre profil à GET /api/user/2001/details. Le serveur confirme que vous êtes connecté, puis renvoie l'identifiant d'utilisateur présent dans le chemin. Envoyez GET /api/user/2002/details et, sur une application vulnérable, vous obtenez les informations de la personne suivante. Vous n'avez jamais cassé la connexion, vous avez seulement demandé quelque chose auquel vous n'auriez pas dû avoir droit, et le serveur a dit oui.
Quand on teste de vraies applications, la première chose à faire est de récupérer deux comptes. Connectez-vous en tant qu'utilisateur A, enregistrez une requête qui touche les données de A, puis rejouez-la avec la session de A mais l'identifiant de B. Si A peut lire ou modifier les ressources de B, vous avez une faille de contrôle d'accès confirmée, avec une preuve propre et reproductible, ce qui est exactement ce dont un rapport a besoin.
Types de contrôle d'accès défaillant
Le contrôle d'accès défaillant est une catégorie, pas un bug unique. Voici les formes que vous croiserez réellement, à peu près par ordre de fréquence dans les tests concrets.
Référence directe d'objet non sécurisée (IDOR)
Un IDOR expose une référence interne (un identifiant de base de données, un nom de fichier ou une clé) et laisse un utilisateur l'échanger contre une qu'il ne possède pas. C'est la figure emblématique de cette catégorie, et elle a droit à sa propre section plus bas tant elle est courante.
Élévation de privilèges verticale
C'est un utilisateur à faibles privilèges qui atteint des fonctions à privilèges élevés. Un compte ordinaire capable de charger /admin/users ou d'appeler une API réservée aux administrateurs monte verticalement, vers des actions réservées à un rôle supérieur.
Élévation de privilèges horizontale
Ici vous restez au même niveau de privilège mais atteignez les données d'un pair. L'utilisateur A qui lit les messages de l'utilisateur B fait une élévation horizontale. La plupart des IDOR sont horizontaux : même rôle, propriétaire différent, aucune vérification que le propriétaire, c'est vous.
Navigation forcée et absence de contrôle au niveau des fonctions
Certaines applications cachent une page en se contentant de ne pas la lier, en supposant que personne ne trouvera l'URL. C'est de la sécurité par l'obscurité, et elle s'effondre dès que quelqu'un devine /admin, le lit dans le JavaScript ou le trouve dans le plan du site. Si le serveur ne vérifie pas le rôle au chargement de la page, le lien caché était le seul verrou.
Altération de métadonnées et de méthode
Les décisions d'accès fondées sur des données contrôlées par le client s'effondrent quand le client modifie ces données. Un JWT avec "role":"user" que le serveur accepte sans vérifier la signature, un en-tête X-Original-URL qui contourne une vérification de chemin, ou un endpoint qui bloque POST mais pas PUT sont tous des échecs de contrôle d'accès déguisés en détails de protocole.
IDOR : la faille de contrôle d'accès la plus courante
La référence directe d'objet non sécurisée (IDOR) est une faille de contrôle d'accès où une application utilise une valeur fournie par l'utilisateur pour récupérer un objet directement, sans vérifier que le demandeur a le droit d'accéder à cet objet. Changez la valeur, obtenez un objet différent. Elle correspond à CWE-639 et reste la forme d'échec de contrôle d'accès la plus signalée dans les programmes de bug bounty.
Le cas classique est la facture. Vous consultez la vôtre à /invoice?id=1043, changez le numéro en 1044, et l'application vous livre celle de quelqu'un d'autre, parce qu'elle a vérifié que vous étiez connecté mais jamais que la facture 1044 était la vôtre. La même forme apparaît avec les noms d'utilisateur (/profile/alice devient /profile/bob), les noms de fichiers (/download?file=report_2024.pdf) et les chemins d'API (/api/orders/58210).
L'IDOR est dangereux précisément parce qu'il est ennuyeux à exploiter. Pas de charge utile astucieuse, pas de tour d'encodage, pas de condition de course. Vous incrémentez un nombre. Ce faible niveau d'exigence explique pourquoi une énumération automatisée d'identifiants avec un outil comme Burp Intruder peut extraire des milliers d'enregistrements d'un seul endpoint vulnérable en quelques minutes, et pourquoi un IDOR sur un objet sensible est souvent classé en gravité haute ou critique.
Une défense courante à ne pas prendre pour argent comptant est le remplacement des identifiants séquentiels par des UUID. Des identifiants aléatoires rendent la devinette plus difficile, ce qui relève la barre, mais ce n'est pas de l'autorisation. Si un UUID fuite par un en-tête referer, un export ou un lien partagé, et que le serveur ne vérifie toujours pas la propriété, l'IDOR reste intact. Les UUID sont un ralentisseur, pas un contrôle.
Comment tester le contrôle d'accès défaillant
Comment teste-t-on le contrôle d'accès défaillant ? Connectez-vous avec deux comptes distincts, capturez les requêtes qu'un compte adresse à ses propres ressources, puis rejouez ces requêtes avec la session de l'autre compte et les identifiants de quelqu'un d'autre. Si le serveur renvoie des données ou exécute des actions qu'il aurait dû bloquer, le contrôle d'accès est défaillant. Les scanners automatisés en manquent la plupart, parce que seul un humain sait quel enregistrement aurait dû appartenir à qui.
Une méthodologie pratique ressemble à ceci :
- Cartographiez chaque rôle. Listez les niveaux de privilège (anonyme, utilisateur, administrateur) et obtenez un compte de test pour chacun. Le contrôle d'accès est relatif, il vous faut donc un point de comparaison.
- Cataloguez les références. Parcourez l'application avec le proxy de Burp Suite actif et notez chaque identifiant, nom d'utilisateur, nom de fichier et valeur de rôle que le client envoie. Chacun est un cas de test.
- Échangez et rejouez. Prenez une requête du compte A et réémettez-la avec la session de A mais l'identifiant de B. Essayez ensuite sans aucune session. Guettez un
200là où vous attendiez un403. - Testez les méthodes et les failles de l'interface. Si
POST /admin/deleteest bloqué, essayezPUTouDELETE. Si un bouton est grisé côté client, envoyez quand même la requête qu'il aurait envoyée.
Dans la pratique, la découverte qui surprend le plus les équipes est l'API d'administration « cachée ». Le front-end n'affiche jamais le contrôle à un utilisateur normal, alors tout le monde le suppose sûr, mais l'endpoint répond à une requête directe depuis n'importe quel compte connecté. L'interface faisait le contrôle d'accès que le serveur a oublié de faire. C'est le visage quotidien de cette vulnérabilité.
Comment prévenir le contrôle d'accès défaillant
Comment prévient-on le contrôle d'accès défaillant ? Appliquez l'autorisation sur le serveur pour chaque requête, refusez par défaut, et rattachez chaque décision d'accès à la session authentifiée plutôt qu'à une valeur envoyée par le client. Ne vous reposez jamais sur le masquage d'un lien ou la désactivation d'un bouton, car le client est entièrement sous le contrôle de l'attaquant.
Superposez ces contrôles, car le contrôle d'accès est une discipline plutôt qu'un correctif unique :
- Refusez par défaut. Chaque ressource commence fermée. L'accès n'est accordé que par une règle explicite, si bien qu'un nouvel endpoint que l'on a oublié de protéger est verrouillé, pas ouvert.
- Vérifiez la propriété sur le serveur, à chaque fois. Avant de renvoyer l'objet 1044, confirmez que la session courante possède l'objet 1044. Faites-le côté backend, sur chaque requête, pas une seule fois à la passerelle. C'est le contrôle qui arrête réellement l'IDOR.
- Ne faites jamais confiance à l'identité côté client. Déduisez l'utilisateur de la session serveur, pas d'un paramètre d'URL, d'un champ caché ou d'un jeton non vérifié. Si un JWT porte un rôle, vérifiez sa signature avant de croire la moindre revendication qu'il contient.
- Centralisez la logique. Une seule couche d'autorisation que chaque requête traverse vaut mieux que des vérifications par endpoint recopiées à la main, car les copies dérivent et l'une d'elles sera fausse.
- Journalisez les échecs d'accès et limitez le débit. Une avalanche de réponses
403sur des identifiants croissants est une attaque par énumération en cours. Enregistrez-la et bridez-la.
La mesure que les équipes ratent le plus souvent est la vérification de l'accès à la mauvaise couche. Une passerelle qui confirme que vous êtes connecté n'est pas la même chose qu'un service qui confirme que vous possédez l'enregistrement, et mettre la seule vérification en bordure laisse chaque appel interne sans garde. Validez la propriété là où la donnée est servie, liée à la session, et toute la classe se referme en grande partie.
Le contrôle d'accès défaillant dans l'OWASP Top 10
Le contrôle d'accès défaillant est l'entrée numéro un depuis l'édition 2021 et a conservé cette place dans l'OWASP Top 10 2025. Il se classe premier sur les données : l'OWASP a trouvé une forme de faiblesse de contrôle d'accès dans une plus grande proportion d'applications testées que toute autre catégorie, et l'impact va de la lecture d'un enregistrement de trop à la prise de contrôle administrative totale.
La révision 2025 a élargi la catégorie. Le Server-Side Request Forgery, qui avait sa propre dixième place en 2021, a été reclassé comme sous-cas du contrôle d'accès défaillant, au motif que le SSRF revient fondamentalement à faire faire au serveur une requête qu'il n'était jamais autorisé à faire. Si l'angle SSRF vous intéresse en particulier, notre guide de l'attaque SSRF couvre les cibles de métadonnées cloud et de services internes qui le rendent dangereux.
Pour la carte complète de la place de ce risque parmi les dix et de ce qui a changé entre les listes 2021 et 2025, notre guide OWASP Top 10 parcourt chaque catégorie avec un exemple concret. Les échecs de contrôle d'accès recoupent aussi les failles d'injection dans la pratique, il vaut donc la peine de le lire aux côtés de notre tutoriel d'injection SQL, où une seule requête peut extraire des enregistrements qu'aucun utilisateur ne devrait atteindre.
Considérations légales et éthiques
Rappel essentiel : obtenez toujours une autorisation écrite explicite avant de tester un système pour le contrôle d'accès défaillant. Changer un identifiant pour lire les données d'un autre utilisateur sur une cible qui ne vous appartient pas constitue un accès non autorisé au titre du Computer Fraud and Abuse Act (États-Unis), du Computer Misuse Act (Royaume-Uni) et de lois équivalentes dans le monde entier, même quand le changement est aussi petit que taper un nombre différent.
- Ne testez que sur des systèmes que vous possédez, dans des labs dédiés, ou dans le périmètre défini d'un engagement autorisé.
- Un IDOR qui renvoie de vraies données utilisateur signifie que vous avez accédé aux informations personnelles de quelqu'un d'autre. Arrêtez-vous à la preuve d'impact, ne téléchargez pas à grande échelle, et signalez-le immédiatement.
- « L'URL me l'a permis » n'est pas une défense juridique. L'autorisation vient de la permission du propriétaire, pas du fait que le serveur ait répondu.
- Entraînez-vous sur des cibles volontairement vulnérables, pas sur des applications réelles trouvées par hasard. Les labs ci-dessous existent pour exactement cela.
Foire aux questions
Qu'est-ce que le contrôle d'accès défaillant en termes simples ?
Le contrôle d'accès défaillant, c'est quand une application laisse un utilisateur connecté faire quelque chose qu'il ne devrait pas pouvoir faire, comme consulter le compte d'une autre personne ou atteindre une page d'administration. L'application vérifie qui vous êtes mais oublie de vérifier si vous avez le droit d'exécuter cette action précise, alors elle livre des données ou des pouvoirs qui devraient être restreints.
Quelle est la différence entre contrôle d'accès défaillant et IDOR ?
Le contrôle d'accès défaillant est la vaste catégorie des échecs d'autorisation. L'IDOR (référence directe d'objet non sécurisée) en est un type précis, où changer une référence comme un identifiant ou un nom de fichier vous donne accès à un objet que vous ne possédez pas. Chaque IDOR est une faille de contrôle d'accès, mais toute faille de contrôle d'accès n'est pas un IDOR.
Pourquoi le contrôle d'accès défaillant est-il numéro un de l'OWASP Top 10 ?
L'OWASP le classe premier parce que ses données ont montré une forme de faiblesse de contrôle d'accès dans une plus grande proportion d'applications testées que toute autre catégorie, et l'impact est élevé. Une seule vérification d'autorisation manquante peut exposer tous les enregistrements d'une table ou accorder un contrôle administratif complet, et ces vérifications sont réparties sur tant d'endpoints que l'une est presque toujours oubliée.
Comment prévient-on le contrôle d'accès défaillant ?
Appliquez l'autorisation sur le serveur pour chaque requête, refusez l'accès par défaut, et fondez chaque décision sur la session authentifiée plutôt que sur des valeurs envoyées par le client. Vérifiez que l'utilisateur connecté possède l'objet précis avant de le renvoyer, centralisez la logique dans une seule couche, et ne comptez jamais sur des liens cachés ou des boutons désactivés, que le client peut contourner.
Les UUID préviennent-ils l'IDOR ?
Non. Remplacer des identifiants séquentiels par des UUID aléatoires rend les références plus difficiles à deviner, ce qui ralentit l'énumération, mais ce n'est pas une vérification d'autorisation. Si un UUID fuite par un lien, un export ou un en-tête referer et que le serveur ne vérifie toujours pas la propriété, l'IDOR reste exploitable. Les UUID sont un ralentisseur, pas un contrôle.
Fait partie de la série OWASP Top 10
Articles liés :
- Tutoriel d'injection SQL
- XSS vs CSRF
- L'attaque SSRF expliquée
- Le contrôle d'accès défaillant expliqué
- Guide de test de sécurité web OWASP
Vos prochaines étapes
Le contrôle d'accès défaillant devient limpide dès que vous en exploitez un vous-même : changez un seul nombre, voyez s'afficher les données d'un inconnu, et la raison de sa première place à l'OWASP Top 10 cesse d'être abstraite. Lire que l'autorisation devrait être vérifiée côté serveur est une chose, voir une application oublier de le faire et vous livrer le panneau d'administration en est une autre. Commencez par l'offre gratuite de HackerDNA, sans carte bancaire, et atteignez des fichiers qui ne vous étaient jamais destinés dans le lab IDOR Explorer. Quand vous voudrez le contrôle d'accès dans le contexte de toute la surface d'attaque, le cours Web Attacks le parcourt aux côtés de l'injection SQL, du XSS et du reste de l'OWASP Top 10 dans des labs guidés en navigateur. Apprenez à repérer la vérification manquante, puis allez écrire celle qui l'arrête.