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.
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.