CVE-2026-110469 是 WidzialniCMS(版本 < 2.5)/panel/upload.php 端点的一个未认证任意文件上传漏洞
原创
网络安全民工
网络安全民工
网络安全民工
2026年11月9日 23:25
北京
去阅读
核心结论:CVE-2026-110469 是 WidzialniCMS(版本 < 2.5)/panel/upload.php 端点的一个未认证任意文件上传漏洞,CVSS 4.0 评分 10.0,可导致远程代码执行(RCE)。漏洞根因是权限检查参数由客户端控制,且 uploadPath 参数验证不足,使未认证攻击者能将任意文件上传至服务器任意位置。目前无公开 PoC 或 Nuclei 模板,但在野利用状态未确认。官方已在 2.5 版本中修复,升级是唯一根治方案。
一、漏洞定性
| 项 | 值 |
|---|---|
| 漏洞类型 | 未限制的危险类型文件上传(CWE-434) |
| CVSS 4.0 | 10.0 Critical (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H) |
| 影响产品 | Fundacja Widzialni WidzialniCMS |
| 影响版本 | 所有低于 2.5 的版本 |
| 修复版本 | 2.5 |
| 攻击入口 | /panel/upload.php ,uploadPath 参数 |
| 认证要求 | 无 (PR:N,未认证可达) |
| 用户交互 | 无 (UI:N) |
| 公开 PoC | 未发现 。多个来源标注 “No exploit is available” |
| 在野利用 | 未确认 。不在 CISA KEV,无公开利用报告 |
漏洞同时影响 /panel/controllers/save_photo.php(CVE-2026-110468,currentpath 参数),两者属于同一类缺陷,攻击者可利用其中任一入口实现 RCE。
二、技术原理:两个客户端可控参数,一条直通 RCE 的路径
2.1 第一层:客户端控制的权限检查参数
代码中的权限检查依赖于一个由请求本身携带的参数。服务端没有在会话或令牌中独立验证调用者的身份,而是信任了客户端提交的值。攻击者只需将该参数设置为“已授权”状态,即可绕过本应存在的访问控制,使未认证请求被当作合法上传处理。
2.2 第二层:uploadPath 缺乏验证
uploadPath 参数指定文件的保存路径,但代码没有对路径进行规范化、白名单校验或目录穿越过滤。结合第一层的权限绕过,攻击者可以:
- 将文件写入 Web 根目录下的任意可写位置;
- 使用文件名穿越(如
../)跳出预期的上传目录。
2.3 从上传到执行
一旦任意文件被写入 Web 可访问的目录,攻击者只需上传一个包含恶意代码的 .php 文件,然后通过 HTTP 请求该文件,服务器便会执行其中的代码。CVSS 向量中的 S:C(范围变更)和 VC:H/VI:H/VA:H 反映了代码执行对主机层面的完整影响。
利用逻辑极其直接:两个可控参数 → 绕过权限 → 控制写入路径 → 写入 Web Shell → 执行。不需要内存布局,不需要绕过工程,门槛集中在“目标是否可达”上。
三、检测与排查
3.1 资产确认
# 检查是否存在 WidzialniCMS 特征curl -s https://target/ | grep -i \"widzialni\"# 或直接探测漏洞端点curl -s -o /dev/null -w \"%{http_code}\" https://target/panel/upload.php
如果 upload.php 返回 200 或 405(方法不允许),说明端点存在,目标可能为 WidzialniCMS。
3.2 Python 只读检测脚本
以下脚本仅确认端点可达性,不发送任何文件上传载荷。
#!/usr/bin/env python3# -*- coding: utf-8 -*-\"\"\"CVE-2026-110469 WidzialniCMS 端点只读检测用法: python check_cve_2026_110469.py https://target仅探测 /panel/upload.php 是否存在,不发送上传请求。\"\"\"import sysimport requestsimport urllib3urllib3.disable_warnings()
TIMEOUT = 10
def check(base): base = base.rstrip(\"/\") print(f\"[*] 目标: {base}\")
# 1) 产品指纹 try: r = requests.get(base, timeout=TIMEOUT, verify=False) except requests.RequestException as e: print(f\"[-] 连接失败: {e}\") return
if \"widzialni\" in r.text.lower(): print(\"[*] 检测到 WidzialniCMS 特征\") else: print(\"[*] 未在前端发现明确特征,继续探测端点\")
# 2) 探测 upload.php 端点(空 GET,不发送文件) endpoint = f\"{base}/panel/upload.php\" try: rp = requests.get(endpoint, timeout=TIMEOUT, verify=False) except requests.RequestException: print(\"[-] 无法访问 /panel/upload.php\") return
if rp.status_code in (200, 400, 405): print(f\"[!] 端点 /panel/upload.php 可达(HTTP {rp.status_code})\") print(\"[!] 目标可能为 WidzialniCMS,存在 CVE-2026-110469\") print(\"[!] 版本确认:低于 2.5 的版本受影响,修复版本为 2.5\") else: print(f\"[*] 端点返回 HTTP {rp.status_code},需人工判断\")
print(\"\
[*] 本脚本不发送文件上传载荷。\") print(\"[*] 检查服务器是否存在非预期的 .php 文件,尤其是在 Web 根目录下。\")
if __name__ == \"__main__\": if len(sys.argv) != 2: print(f\"用法: {sys.argv[0]} https://target\") sys.exit(1) check(sys.argv[1])
3.3 失陷排查
由于漏洞允许写入任意文件,排查的重点是Web 可访问目录中是否出现了非预期的可执行文件。
- 文件系统:检查 Web 根目录及
uploadPath可能指向的目录中是否存在非预期的.php、.phtml、.phar文件,尤其是创建时间与异常上传请求相关的文件。 - Web 日志:检索对
/panel/upload.php的 POST 请求,且uploadPath参数包含目录穿越序列(../)或指向 Web 根目录的记录。 - 上传文件的访问:日志中是否有对非发行版自带 PHP 文件的 HTTP 200 响应。
3.4 Nuclei 不适用
公开来源未提供可用的 Nuclei 模板。该漏洞的验证需要构造特定的多部分上传请求并控制两个参数,超出了单次 HTTP 模板的合理范围。发送利用载荷在非授权环境中构成攻击行为,不应在批量扫描中执行。资产排查应依赖版本核对(低于 2.5 即受影响)和端点指纹。
四、修复与缓解
4.1 升级(唯一根治)
升级至 WidzialniCMS 2.5 或更高版本。修复版本在权限检查和 uploadPath 验证两个层面都做了修正。由于 CVE 于 2026 年 11 月 9 日刚刚公开,2.5 版本很可能已经可用,应立即从厂商渠道获取并部署。
4.2 无法立即升级时的缓解
| 措施 | 效果 | 局限 |
|---|---|---|
| 在 Web 服务器层禁止上传目录执行脚本 | 即使文件被写入,也无法执行 | 需要确认 uploadPath 可指向的所有目录 |
WAF 拦截 /panel/upload.php 的未认证 POST 请求 |
阻断最直接的攻击路径 | 攻击者可能使用编码或变形绕过 |
限制 uploadPath 可写入的目录范围 (如通过文件系统权限) |
使目录穿越无法到达敏感位置 | 需要精确的权限配置 |
Nginx 阻断示例:
location ~* /panel/(upload|controllers/save_photo)\\.php$ { # 仅允许已认证的会话(根据实际会话机制调整) if ($http_cookie !~* \"your_auth_cookie\") { return 403; }}
4.3 失陷后处置
如果站点曾暴露且未修复,应假设攻击者可能已经上传了 Web Shell:
- 扫描 Web 目录中的可疑
.php文件,检查文件内容是否包含eval、system、base64_decode等代码执行特征。 - 轮换所有数据库凭据、API 密钥和 WordPress 盐值。
- 审查管理员用户列表,移除任何非预期创建的账户。
- 检查出站连接,Web 服务器发起的异常外联可能是后门活动的迹象。
五、今晚的判断
CVE-2026-110469 的风险画像:CVSS 10.0、未认证、利用逻辑直接(两个客户端可控参数 → 任意文件写入 → RCE)、无公开 PoC 但披露刚发生、厂商修复版本已存在。
行动顺序:
- 确认站点是否运行 WidzialniCMS,以及版本是否低于 2.5。
- 升级至 2.5。这是关闭漏洞的唯一确定性方式。
- 如果无法立即升级,在 Web 服务器层禁止
/panel/upload.php和/panel/controllers/save_photo.php的未认证访问,并限制上传目录的脚本执行权限。 - 检查 Web 目录中是否有非预期的可执行文件。如果有,按已失陷进行排查和凭据轮换。
CVSS 10.0 的评分来自“未认证 + 任意文件写入 + 代码执行”这三个事实的组合。 漏洞刚公开,公开 PoC 尚未出现,但这不改变暴露面的性质——攻击者不需要等待 PoC 来理解如何上传一个文件。升级到 2.5,或者在此之前把上传端点的未认证可达性关掉,是当前窗口期里最确定的两个动作。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论