Injection SQL
Principe de l'attaque
Une injection SQL se produit lorsqu'un attaquant peut insérer des commandes malveillantes dans une requête SQL qui sont ensuite exécutées par le système.
Dans le contexte des applications Web, l'Injection SQL est une attaque très courante où l'attaquant peut manipuler une requête SQL en injectant du code malveillant.
Une application Web vulnérable
Imaginons une application Web simple qui utilise une base de données MySQL/MariaDB pour stocker les informations d'utilisateur.
https://github.com/MathisLaveille/InjectionSQL
Code source de la version vulnérable
Code du fichier index.php
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// Création de la connexion
$conn = new mysqli($servername, $username, $password, $dbname);
// Vérification de la connexion
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Récupération de l'ID utilisateur depuis le formulaire
$user_id = $_POST['user_id'];
// Requête SQL vulnérable
$sql = "SELECT * FROM Users WHERE id = $user_id";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// Affichage des données de chaque ligne
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " " . $row["email"]. "<br>";
}
} else {
echo "0 results";
}
$conn->close();
?>
Code du fichier myDB.sql
CREATE DATABASE myDB;
USE myDB;
CREATE TABLE Users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(50),
password VARCHAR(255)
);
INSERT INTO Users (name, email, password) VALUES
('Georges Dupond', 'g.dupond@example.com', '$2y$10$eImiTXuWVxfM37uY4JANj.QjrfGPyt6wQEX/GRZCX2Bsx3LIJ1ZHO'), -- mot de passe : "password"
('Jeanne Durand', 'j.durand@example.com', '$2y$10$eImiTXuWVxfM37uY4JANj.QjrfGPyt6wQEX/GRZCX2Bsx3LIJ1ZHO'); -- mot de passe : "password"
Pour exécuter ce script SQL, vous pouvez utiliser la commande suivante dans votre terminal (remplacez username et password par vos identifiants MySQL/MariaDB) :
mysql -u username -p < script.sql
Et pour lancer le serveur PHP, utilisez la commande suivante dans le répertoire contenant votre fichier index.php :
php -S localhost:8000
Ensuite, vous pouvez ouvrir votre navigateur et aller à l'adresse http://localhost:8000/ pour voir l'application en action.
Le mot de passe haché dans cet exemple correspond au mot de passe "password".
Dans une application réelle, vous devez hacher les mots de passe des utilisateurs lorsqu'ils s'inscrivent ou modifient leur mot de passe. Vous pouvez utiliser la fonction
password_hash()de PHP pour cela.