Authentification et autorisation
Vulnérabilités liées à l'authentification et à l'autorisation
Notions théoriques
L’authentification et l’autorisation sont 2 concepts essentiels en sécurité informatique.
Une mauvaise implémentation peut entraîner des failles critiques, comme l’accès non autorisé à des données sensibles.
Authentification vs Autorisation
| Concept | Définition |
|---|---|
| Authentification | Vérifie l’identité d’un utilisateur (ex : login/mot de passe). |
| Autorisation | Détermine ce qu’un utilisateur peut faire après authentification. |
Vulnérabilités courantes
Attaque par force brute
- Un attaquant essaie de deviner un mot de passe en testant de nombreuses combinaisons.
- Exemple : Tester
admin,admin123,password,123456.
Attaque par interception (Man-in-the-Middle)
- Un attaquant intercepte les identifiants si la connexion n’est pas sécurisée (ex : HTTP au lieu de HTTPS).
- Exemple : Un mot de passe envoyé en clair peut être volé sur un réseau Wi-Fi public.
Réutilisation de sessions
- Un attaquant vole un cookie de session pour se faire passer pour un utilisateur légitime.
- Exemple : Si un site ne régénère pas la session après connexion, un attaquant peut exploiter un cookie volé.
Contournement de l’authentification
- Une faille dans le code permet d’accéder à un compte sans mot de passe.
- Exemple : Une URL comme
site.com/profil?id=1permet d’accéder à d’autres comptes en changeantid.
Escalade de privilèges
- Un utilisateur normal obtient des droits administrateur par erreur.
- Exemple : Modifier une requête HTTP pour passer de
role=useràrole=admin.
Bonnes pratiques pour sécuriser l’authentification
✔️ Utiliser HTTPS pour chiffrer les communications.
✔️ Limiter les tentatives de connexion (ex : 3 essais avant blocage).
✔️ Utiliser un hachage sécurisé pour stocker les mots de passe (bcrypt, argon2).
✔️ Régénérer la session après connexion pour éviter le vol de session.
✔️ Vérifier les permissions sur chaque action pour éviter l’escalade de privilèges.
Exemple pratique
Nous allons analyser un système d’authentification vulnérable et le corriger.
Code d’un système vulnérable
<?php
$pdo = new PDO("mysql:host=localhost;dbname=security_test", "root", "");
// ⚠️ Problème : Requête non sécurisée
$query = "SELECT * FROM users WHERE username = '" . $_POST['username'] . "' AND password = '" . $_POST['password'] . "'";
$result = $pdo->query($query);
if ($result->rowCount() > 0) {
echo "✔️ Connexion réussie !";
} else {
echo "❌ Échec de la connexion.";
}
?>
Problèmes de sécurité
- Injection SQL possible (
' OR '1'='1permet de se connecter sans mot de passe). - Mot de passe stocké en clair (un attaquant peut le voler si la base est compromise).
- Pas de limitation des tentatives (vulnérable aux attaques par force brute).
Code sécurisé
<?php
$pdo = new PDO("mysql:host=localhost;dbname=security_test", "root", "");
// ✔️ Utilisation de requêtes préparées
$query = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$query->execute([$_POST['username']]);
$user = $query->fetch();
if ($user && password_verify($_POST['password'], $user['password'])) {
session_start();
$_SESSION['user'] = $user['username'];
echo "✔️ Connexion réussie !";
} else {
echo "❌ Échec de la connexion.";
}
?>
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Dans ce TP, vous allez analyser et corriger un formulaire vulnérable pour le rendre sécurisé :
✔️ Protéger un site contre les injections SQL
✔️ Empêcher les attaques XSS
✔️ S écuriser les mots de passe et l’authentification
✔️ Tester les vulnérabilités et vérifier les protections
Étape 1 : Préparer l’environnement
Nous allons utiliser un serveur local sous Debian avec Apache, PHP et MySQL.
Installation des services nécessaires
Ouvrez un terminal et exécutez les commandes suivantes pour installer les outils essentiels :
sudo apt update
sudo apt install apache2 php php-mysql mariadb-server -y
Démarrer Apache et MySQL
sudo systemctl start apache2
sudo systemctl start mariadb
Sécuriser MySQL
optionnel mais recommandé
sudo mysql_secure_installation
Répondez aux questions pour définir un mot de passe root et sécuriser l’accès.
Étape 2 : Créer une BD vulnérable
Nous allons créer une table users avec des identifiants stockés sans protection (ce qui est une mauvaise pratique).