### Description
Les failles d'injection SQL se produisent lorsque des entrées utilisateur sont directement incluses dans des requêtes SQL sans validation ou échappement adéquat. Cela permet à un attaquant de manipuler les requêtes SQL exécutées par l'application, pouvant conduire à la divulgation de données sensibles, à la modification de données, à l'exécution de commandes administratives sur la base de données, et à d'autres conséquences graves.
---
### Exemple d'Attaque SQL Injection
**Scénario d'attaque :**
- Une application web accepte des entrées utilisateur et les utilise directement dans une requête SQL, par exemple une page de connexion qui vérifie les identifiants des utilisateurs.
**Exemple de code vulnérable :**
```php
<?php
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $query);
?>
```
**Exploitation :**
- Un attaquant peut manipuler les entrées pour altérer la requête SQL, par exemple en entrant `' OR '1'='1` comme nom d'utilisateur ou mot de passe.
```sql
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1'
```
---
### Prévention des Attaques SQL Injection
**Utilisation de Requêtes Préparées :**
- Utiliser des requêtes préparées avec des paramètres liés pour empêcher l'injection SQL.
```php
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
sstmt->execute();
```
**Échappement des Entrées Utilisateur :**
- Échapper correctement toutes les entrées utilisateur avant de les inclure dans des requêtes SQL.
```php
$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $query);
```
**Utilisation d'ORMs :**
- Utiliser des Object-Relational Mappers (ORMs) qui abstraient les requêtes SQL et fournissent des mécanismes de protection contre les injections SQL.
```php
$user = User::where('username', $username)->where('password', $password)->first();
```
---
### Détection des Failles SQL Injection
**Revue de Code :**
- Examiner le code source pour identifier les endroits où des entrées utilisateur sont directement incluses dans des requêtes SQL sans validation ou échappement adéquat.
**Tests Manuels :**
- Effectuer des tests manuels en manipulant les paramètres de requêtes pour vérifier la présence de vulnérabilités d'injection SQL.
**Utilisation d'Outils de Sécurité :**
- Utiliser des outils de sécurité tels que SQLMap, Burp Suite, ou des scanners spécifiques pour détecter les failles d'injection SQL.
---
### Exemples de Prévention
**Requêtes Préparées :**
```php
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
```
**Utilisation de PDO :**
```php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->execute(['username' => $username, 'password' => $password]);
```
**Validation et Sanitation des Entrées :**
```php
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
$password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING);
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
```
---
| Catégorie | Information |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **TTP** | Technique d'injection de code SQL dans les requêtes de base de données |
| **CWE** | CWE-89 (Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')) |
| **Description de l'attaque** | L'injection SQL se produit lorsqu'un attaquant insère ou "injecte" une requête SQL malveillante via les données d'entrée d'une application. Cela peut permettre à l'attaquant de lire, modifier, ou supprimer des données dans la base de données. |
| **Impacts potentiels** | - Fuite de données confidentielles<br>- Perte d'intégrité des données<br>- Prise de contrôle de la base de données |
| **Comment la détecter** | - Analyse des journaux d'applications pour des requêtes SQL suspectes<br>- Utilisation de systèmes de détection d'intrusion<br>- Tests de pénétration et scans de vulnérabilité |
| **Remédiations/mitigations** | - Utilisation de requêtes préparées (PreparedStatement) et ORM<br>- Validation et échappement des entrées utilisateur<br>- Mise en œuvre de listes blanches pour les entrées utilisateur<br>- Formation des développeurs aux pratiques sécurisées de codage |
| **Lien de référence** | [OWASP - SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection) |