Chapitre 7 — Codage Sécurisé, SQLi, XSS & Buffer Overflow
Les attaques d'injection et les vulnérabilités de code sont parmi les plus courantes. Ce module couvre le OWASP Top 10, les attaques par injection et les principes du codage sécurisé.
L'injection SQL se produit quand un attaquant insère du code SQL malveillant dans un champ de saisie pour manipuler la base de données.
Formulaire de connexion :
SELECT * FROM users WHERE username='$user' AND password='$pass'Attaquant entre comme username :
' OR '1'='1Résultat :
SELECT * FROM users WHERE username='' OR '1'='1' AND password='''1'='1' est toujours vrai → accès accordé sans mot de passe.
Types d'injection SQL
- In-band SQLi : les résultats reviennent dans la réponse HTTP (Error-based, Union-based).
- Blind SQLi : pas de données dans la réponse — déduction par questions vrai/faux (Boolean-based) ou délais (Time-based).
- Out-of-band SQLi : exfiltration via DNS ou HTTP vers un serveur externe.
Contre-mesures SQLi : requêtes paramétrées (Prepared Statements), procédures stockées, ORM, validation des entrées, WAF, principle of least privilege sur le compte DB.
XSS permet à un attaquant d'injecter du code JavaScript malveillant dans une page web vue par d'autres utilisateurs.
| Type XSS | Description | Persistance |
|---|---|---|
| Stored (Persistent) | Le script est stocké dans la base de données et exécuté pour chaque visiteur | Persistant — affecte tous les utilisateurs |
| Reflected (Non-Persistent) | Le script est reflété dans la réponse depuis l'URL/requête. La victime doit cliquer sur un lien malveillant. | Non persistant |
| DOM-based | Le script modifie le DOM côté client sans passer par le serveur | Côté client uniquement |
Contre-mesures XSS : encodage des sorties (output encoding), Content Security Policy (CSP), validation des entrées, HttpOnly cookies (empêche JS d'accéder aux cookies), WAF.
CSP (Content Security Policy) est une des meilleures défenses contre XSS. En définissant une politique CSP stricte (ex: "n'exécuter que des scripts du même domaine"), même si un XSS est injecté, le navigateur refusera de l'exécuter.
- Command Injection : injection de commandes OS dans des paramètres traités par le système. Ex:
filename.txt; rm -rf /. Contre-mesure : ne jamais passer des entrées utilisateur à des shells système. - LDAP Injection : injection dans des requêtes LDAP — similaire à SQLi mais pour les annuaires.
- XML/XPath Injection : injection dans des requêtes XML pour accéder à des données non autorisées.
- CSRF (Cross-Site Request Forgery) : forcer un utilisateur authentifié à exécuter des actions non souhaitées sur un site web en exploitant sa session active. Contre-mesure : tokens CSRF, SameSite cookies, vérification de l'origine (Referer/Origin header).
Un buffer overflow se produit quand un programme écrit plus de données que la mémoire allouée peut en contenir — les données débordent dans des zones mémoire adjacentes.
- Stack Buffer Overflow : débordement dans la pile (stack) — peut écraser l'adresse de retour et rediriger l'exécution vers du code malveillant.
- Heap Buffer Overflow : débordement dans le tas (heap) — exploitation plus complexe.
- Contre-mesures : ASLR (Address Space Layout Randomization — randomise l'emplacement en mémoire), DEP/NX (Data Execution Prevention — empêche l'exécution de code dans des zones de données), Stack Canaries (valeur sentinelle détectant les débordements), Bounds Checking (langages modernes).
- Langages sûrs : Java, Python, Rust vérifient automatiquement les bornes — pas vulnérables. C/C++ sans protection le sont.
- Validation des entrées : valider TOUTES les entrées utilisateur (type, longueur, format). Whitelist (accepter uniquement ce qui est connu bon) > Blacklist (bloquer ce qui est connu mauvais).
- Encodage des sorties : encoder les données avant de les afficher dans HTML, JS, SQL.
- Requêtes paramétrées : séparent le code SQL des données — l'entrée ne peut jamais modifier la structure de la requête.
- Moindre privilège : les comptes de DB ne doivent avoir que les droits nécessaires (SELECT uniquement si lecture seule).
- Gestion sécurisée des erreurs : ne jamais exposer les erreurs techniques aux utilisateurs (stack traces, messages SQL) — ils donnent des informations aux attaquants.
- Chiffrement des données sensibles : jamais de mots de passe en clair, hachage avec sel.
- Code Review / SAST : analyse statique du code source pour détecter les vulnérabilités avant déploiement.
- DAST (Dynamic Application Security Testing) : tests de sécurité dynamiques sur l'application en fonctionnement.