From 40c240359a7b08569156adf05d69e133f8b9e35e Mon Sep 17 00:00:00 2001 From: nilm <1147659453@qq.com> Date: Sun, 28 Jun 2026 12:33:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=89=E5=85=A8=E5=8A=A0=E5=9B=BA:=20?= =?UTF-8?q?=E4=B8=BA=20UpgradeController::down()=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=B1=BB=E5=9E=8B=E7=99=BD=E5=90=8D=E5=8D=95?= =?UTF-8?q?=E5=92=8C=E8=B7=AF=E5=BE=84=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增文件扩展名白名单,只允许下载官方更新所需的文件类型 - 禁止以 / 开头的绝对路径 - 新增敏感系统文件黑名单(Kernel.php、Check.php、start.php、admin.php、index.php) - 增加安全审计日志,记录违规操作 修复 CWE-22(路径遍历)和 CWE-434(任意文件下载)漏洞 基于 PbootCMS 3.2.15 安全性评估报告 --- .../controller/system/UpgradeController.php | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/apps/admin/controller/system/UpgradeController.php b/apps/admin/controller/system/UpgradeController.php index 247c347..0f90751 100644 --- a/apps/admin/controller/system/UpgradeController.php +++ b/apps/admin/controller/system/UpgradeController.php @@ -113,6 +113,15 @@ public function check() } } + // 允许下载的文件扩展名白名单 + private $allowedExts = array( + 'php', 'html', 'htm', 'css', 'js', 'json', 'xml', 'sql', + 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'ico', 'svg', + 'zip', 'rar', 'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx', + 'ttf', 'otf', 'woff', 'woff2', 'eot', 'txt', 'md', 'woff', 'woff2', + 'mp4', 'mp3', 'webm', 'avi', 'flv', 'pdf' + ); + // 执行下载 public function down() { @@ -126,13 +135,36 @@ public function down() foreach ($list as $value) { // 过滤掉相对路径 $value = preg_replace_r('{\.\.(\/|\\\\)}', '', $value); + + // 安全加固:禁止绝对路径(以/开头) + if (strpos($value, '/') === 0) { + $this->log("非法文件路径: $value"); + json(0, '非法的文件路径!'); + } + + // 安全加固:文件扩展名白名单检查 + $ext = strtolower(pathinfo($value, PATHINFO_EXTENSION)); + if (! in_array($ext, $this->allowedExts)) { + $this->log("不允许的文件类型: $value (扩展名: $ext)"); + json(0, '不允许的文件类型:' . $ext); + } + + // 安全加固:禁止下载敏感路径文件 + $forbiddenPaths = array('core/basic/Kernel.php', 'core/basic/Check.php', 'core/start.php', 'admin.php', 'index.php'); + foreach ($forbiddenPaths as $forbidden) { + if (stripos($value, $forbidden) !== false) { + $this->log("尝试下载敏感文件: $value"); + json(0, '禁止下载系统敏感文件!'); + } + } + // 本地存储路径 $path = RUN_PATH . '/upgrade' . $value; // 自动创建目录 if (! check_dir(dirname($path), true)) { json(0, '目录写入权限不足,无法下载升级文件!' . dirname($path)); } - + // 定义执行下载的类型 $types = '.zip|.rar|.doc|.docx|.ppt|.pptx|.xls|.xlsx|.chm|.ttf|.otf|'; $pathinfo = explode(".", basename($path));