OWASP Top 10 Débutant

Les 10 Menaces Critiques du Web : Maîtriser l'OWASP Top 10

Découvrez les vulnérabilités les plus dangereuses qui menacent vos applications web et apprenez à les identifier et les neutraliser. Un guide essentiel pour sécuriser vos projets dès aujourd'hui.

Preparetoi.academy 30 min

1. L'Injection SQL : Le Cheval de Troie des Bases de Données

Définition

L'injection SQL est une vulnérabilité qui permet à un attaquant d'injecter du code SQL malveillant dans une application web. Elle se produit lorsqu'une application construit des requêtes SQL en concaténant directement les données fournies par l'utilisateur sans les valider ou les échapper correctement. L'attaquant peut alors exécuter des commandes SQL non autorisées, accéder à des données sensibles, modifier la base de données ou supprimer des informations critiques.

Analogie Simple

Imaginez un restaurant où le serveur prend votre commande écrite sur un papier, puis la photocopie exactement dans le carnet de cuisine, sans chercher à comprendre si elle est logique. Si vous écrivez "J'aimerais un steak ET AUSSI annuler toutes les commandes du jour", le système exécutera les deux instructions. C'est exactement ce qu'un pirate fait avec une base de données via l'injection SQL.

Tableau Comparatif

Aspect Requête Normale Requête Injectée
Entrée utilisateur "jean.dupont" "' OR '1'='1"
Requête générée SELECT * FROM users WHERE username='jean.dupont' SELECT * FROM users WHERE username='' OR '1'='1'
Résultat Un utilisateur TOUS les utilisateurs
Risque Aucun Critique

Astuce Pratique

Utilisez toujours des requêtes paramétrées (prepared statements) dans votre code. Au lieu de concaténer les variables directement dans la requête SQL, utilisez des placeholders : SELECT * FROM users WHERE username = ? où le ? sera remplacé de manière sécurisée par la valeur de l'utilisateur.

⚠️ Attention

Ne jamais faire confiance aux données en provenance de l'utilisateur, même si elles semblent inoffensives. Un pirate peut contourner les validations côté client en modifiant les requêtes HTTP directement. La validation doit toujours se faire côté serveur.


2. L'Authentification Brisée : Forcer la Porte

Définition

L'authentification brisée désigne les failles de sécurité qui permettent à un attaquant de contourner le mécanisme d'identification d'un utilisateur. Cela inclut les mots de passe faibles, les sessions non sécurisées, les cookies mal protégés, l'absence de multi-facteur, ou les mécanismes de récupération de mot de passe insuffisants. Une authentification brisée permet à quelqu'un de prendre l'identité d'un autre utilisateur et d'accéder à ses données ou fonctionnalités.

Analogie Simple

Pensez à l'authentification comme la serrure d'une maison. Une "authentification brisée" signifie que la serrure est facile à forcer : peut-être qu'elle n'a pas de verrou, que la clé est écrite sur la porte, ou qu'on peut l'ouvrir en soufflant dessus. Un intrus n'a besoin d'aucune clé pour entrer ; il exploite simplement la faiblesse du système.

Tableau des Risques Courants

Vulnérabilité Exemple Impact
Mots de passe faibles "123456" ou "password" Accès facile aux comptes
Sessions prévisibles ID de session numérique croissant Usurpation de session
Pas de protection contre le brute force Tentatives infinies sans limite Accès par force brute
Cookies non sécurisés Transmis en HTTP clair Interception par réseau
Pas de 2FA Seul le mot de passe requis Accès malgré mot de passe fort

Astuce Pratique

Imposez une authentification multifacteur (2FA) : combinez quelque chose que vous connaissez (mot de passe) avec quelque chose que vous possédez (téléphone, clé de sécurité). Même si un pirate obtient votre mot de passe, il ne pourra pas accéder à votre compte sans le deuxième facteur.

⚠️ Attention

Les sessions doivent expirer après une période d'inactivité. Ne conservez jamais les informations d'authentification en clair, ni en cookies non sécurisés. Utilisez des tokens JWT avec expiration ou des sessions serveur avec des identifiants aléatoires cryptographiquement forts.


3. L'Exposition de Données Sensibles : Laisser les Clés Dehors

Définition

L'exposition de données sensibles se produit lorsqu'une application transmet, stocke ou affiche des informations confidentielles sans protection suffisante. Cela comprend les données personnelles, les numéros de carte bancaire, les mots de passe, les tokens d'authentification, ou tout autre information qui ne devrait être accessible qu'aux personnes autorisées. L'exposition peut se faire via une transmission en HTTP clair, un stockage non chiffré, des messages d'erreur verbeux, ou des fichiers accessibles publiquement.

Analogie Simple

Imaginez que vous mettez vos papiers d'identité importants dans une enveloppe en papier transparent et que vous les laissez sur votre bureau, visible par tous. Pire encore, vous les envoyez par la poste sans enveloppe fermée. C'est ce que fait une application qui envoie des données sensibles sans chiffrement.

Tableau de Protection des Données

Type de Donnée Non Chiffré Chiffré en Transport Chiffré en Stockage Sécurisé
Mot de passe ✅ (Hash)
Données bancaires
Email utilisateur
Données de session

Astuce Pratique

Utilisez HTTPS systématiquement sur tout votre site. Le certificat SSL/TLS chiffre automatiquement toutes les données en transit. C'est devenu un standard, gratuit avec Let's Encrypt, et les navigateurs avertissent les utilisateurs des sites en HTTP. Aucune excuse pour ne pas l'utiliser.

⚠️ Attention

Ne stockez jamais les mots de passe en clair. Utilisez des fonctions de hachage robustes comme bcrypt, Argon2 ou PBKDF2. Même avec une intrusion, les attaquants ne pourront pas récupérer les mots de passe. De plus, attention aux données affichées en clair dans les logs ou les messages d'erreur visibles par l'utilisateur.


4. L'Entité Externe XML (XXE) : Arme Cachée dans les Fichiers

Définition

Une vulnérabilité XXE (XML External Entity) se produit lorsqu'une application traite des fichiers XML sans désactiver le traitement des entités externes. Un attaquant peut injecter des références malveillantes dans un fichier XML qui permettent de lire des fichiers locaux du serveur, effectuer des requêtes réseau non autorisées, ou réaliser une attaque par déni de service. Cette vulnérabilité exploite les parseurs XML mal configurés.

Analogie Simple

Pensez à un formulaire qui accepte un document XML. Le document vous dit : "Remplacez cette partie par le contenu du fichier /etc/passwd". Si le formulaire fait aveuglément ce qu'on lui dit sans vérifier, un attaquant peut demander à lire des fichiers secrets du serveur en injectant cette instruction malveillante dans le XML.

Tableau des Types d'Attaques XXE

Type d'Attaque Description Conséquence
Lecture de fichiers Référence à /etc/passwd ou fichiers config Divulgation de données sensibles
SSRF Requête forcée vers serveur interne Accès à services internes
DoS Entité recursive infinie Crash ou ralentissement du serveur
Blind XXE XXE sans réponse directe Extraction de données via canal indirect

Astuce Pratique

Désactivez le traitement des entités externes dans votre parseur XML. En Python avec lxml, utilisez parser = lxml.etree.XMLParser(resolve_entities=False). Dans Java, configurez le DocumentBuilderFactory pour refuser les entités externes. Chaque langage a ses méthodes spécifiques pour sécuriser le parsing XML.

⚠️ Attention

Même si vous pensez que XML n'est plus utilisé, il revient souvent dans les API SOAP, les fichiers SVG uploadés, ou les données RSS. Validez et limitez toujours la structure des fichiers XML entrants. Préférez JSON quand c'est possible : il ne souffre pas des mêmes problèmes de traitement d'entités.


5. Le Contrôle d'Accès Brisé : Des Portes Ouvertes à Tous

Définition

Le contrôle d'accès brisé désigne une vulnérabilité où une application ne protège pas correctement les ressources en fonction du rôle ou des permissions de l'utilisateur. Un utilisateur peut accéder à des ressources qu'il ne devrait pas voir, modifier ou supprimer des données d'autres utilisateurs, ou escalader ses privilèges. Cela inclut l'accès direct à des URLs restreintes, la modification d'identifiants dans les requêtes, ou l'absence de vérification des permissions côté serveur.

Analogie Simple

Imaginez un hôtel où chaque chambre a un numéro. Un client a une clé pour la chambre 105. S'il essaie simplement de changer le numéro en 106 sur la porte, l'hôtel ouvre sans vérifier si c'est vraiment sa chambre. C'est un contrôle d'accès brisé : on n'a pas vérifié les permissions, on a juste fait confiance à ce que l'utilisateur demandait.

Tableau des Scénarios d'Accès Non Autorisé

Scénario Action Utilisateur Vérification Manquante Risque
Énumération d'ID Modifier l'ID du profil en URL Pas de vérification côté serveur Voir les profils d'autres utilisateurs
Escalade de privilèges Ajouter un paramètre admin=true Pas de vérification du rôle Devenir administrateur
Accès à fonction sensible Deviner l'URL /admin/delete Pas d'authentification sur la page Supprimer des données
Modification de données Changer l'ID du formulaire Pas de vérification de propriété Modifier les données d'autrui

Astuce Pratique

Implémentez systématiquement une vérification côté serveur pour chaque action sensible. Ne faites jamais confiance aux paramètres envoyés par le client. Par exemple, avant de afficher un profil utilisateur, vérifiez que l'utilisateur connecté a effectivement le droit de voir ce profil : if (profile.owner_id === current_user.id) { return profile; }.

⚠️ Attention

L'absence de contrôle d'accès est souvent invisible. Testez votre application en vous connectant avec un compte utilisateur normal et en essayant d'accéder à des ressources que vous ne devriez pas pouvoir voir. Faites tester par quelqu'un d'autre : ce qui semble logique pour vous peut être exploitable pour un attaquant.

Accédez à des centaines d'examens QCM — Découvrir les offres Premium