当前位置: 首页 > article >正文

Grav CMS 组合拳漏洞| CVE-2026-42613CVE-2026-42607复现研究

0x0 背景介绍Grav是一个基于文件的Web平台。在2.0.0-beta.2之前版本中存在两个高危漏洞可导致组合利用权限提升漏洞-CVE-2026-42613Grav的Login插件在处理用户注册请求时未对请求数据中的groups/access字段进行服务端校验。当管理员在插件配置中启用注册功能并将groups/access添加为注册表单的可用字段时未认证的攻击者可通过构造带有恶意groups/access参数的注册请求攻击者无需任何凭据直接创建出拥有超级管理员权限的账户实现未授权权限提升远程代码执行漏洞-CVE-2026-42607Grav管理后台的“直接安装”功能在解压用户上传的ZIP插件包时未对包内的文件类型和内容做任何安全检查,直接调用Installer::install后者仅使用ZipArchive::extractTo进行解压。拥有管理员权限的攻击者可以上传一个包含恶意PHP代码的合法结构插件ZIP包其中的PHP文件会随Grav的插件初始化事件自动执行进而在服务器上写入Webshell或执行任意系统命令最终获得服务器控制权。0x1 漏洞复现简单概述下# 1.docker-compose.yml文件 mkdir ~/grav-cve413 cd ~/grav-cve413 cat docker-compose.yml EOF services: grav: image: php:8.0-apache container_name: grav-cms ports: - 8080:80 volumes: - ./html:/var/www/html - ./php.ini:/usr/local/etc/php/conf.d/custom.ini command: bash -c # 安装必要工具和库 apt-get update apt-get install -y unzip git libfreetype6-dev libjpeg62-turbo-dev libpng-dev libzip-dev zlib1g-dev libicu-dev libyaml-dev # 启用 Apache 重写 a2enmod rewrite # 安装 PHP 扩展 docker-php-ext-configure gd --with-freetype --with-jpeg docker-php-ext-install -j$(nproc) gd zip intl pecl install yaml docker-php-ext-enable yaml # 下载 Grav 1.7.52 并部署 if [ ! -f /var/www/html/index.php ]; then curl -L -o /tmp/grav.zip https://getgrav.org/download/core/grav-admin/1.7.52 unzip -q /tmp/grav.zip -d /tmp/grav-extract mv /tmp/grav-extract/grav-admin/* /var/www/html/ mv /tmp/grav-extract/grav-admin/.* /var/www/html/ 2/dev/null || true rm -rf /tmp/grav.zip /tmp/grav-extract chown -R www-data:www-data /var/www/html/ fi apache2-foreground EOF # 2. php.ini cat php.ini EOF memory_limit 256M upload_max_filesize 20M post_max_size 25M max_execution_time 120 display_errors Off EOF # 3.修复阿里云镜像源 docker exec grav-cms bash -c sed -i s/deb.debian.org/mirrors.aliyun.com/g /etc/apt/sources.list apt-get update # 4.安装 Login 插件v3.8.0并创建配置文件目录 docker exec grav-cms bash -c rm -rf /var/www/html/user/plugins/login git clone -b 3.8.0 https://github.com/getgrav/grav-plugin-login.git /var/www/html/user/plugins/login mkdir -p /var/www/html/user/config/plugins cp /var/www/html/user/plugins/login/login.yaml /var/www/html/user/config/plugins/login.yaml # 5. 开启必要的参数示例 #/var/www/html/user/config/plugins/login.yaml enabled: true built_in_css: true built_in_js: true redirect_after_login: / redirect_after_logout: / user_registration: enabled: true fields: - username - password - email - fullname - groups # is - access # is0x2 漏洞复现前置条件管理员启用了用户注册且将groups、access加入注册表单字段安装并启用Admin插件攻击者持有管理员凭据或等效会话2.1-脚本验证两个单独的脚本可以先创建用户再执行RCEhttps://github.com/Kai-One001/cve-/blob/main/Grav_CMS_login_CVE-2026-42613.py https://github.com/Kai-One001/cve-/blob/main/Grav_CMS_RCE_CVE-2026-42607.py2.2-复现流量特征 (PCAP)https://github.com/Kai-One001/PCAP-For-Cybersecurity.rule/blob/main/2026/Grav_CMS_RCE_CVE-2026-42613%26CVE-2026-42607.pcap挑取部分的截图明文可见项目结构后续Shell没忍住shell了0x3 漏洞原理分析3.0-架构与模块定位本次分析是Grav v1.7.52核心发行包没有看user/plugins/admin因此下文代码级实证以当前工作区可核对的为主。Grav的包管理分为三层管理后台暴露HTTP入口Grav Package Manager在system核心中完成下载、解压与安装编排Installer作为底层驱动封装ZipArchive解压、目标目录校验以及install.php钩子加载了解这些思路就清晰了。3.1-锁定关键路径从管理员选择的 ZIP 文件出发数据流在核心层必然经过**Installer::unZip这里使用ZipArchive::open与extractTo整包解压**解压结果路径由ZIP内第一条目录名与临时目录拼接得到随后**Installer::install** 在未使用sophisticated模式时对插件默认走**moveInstall**将整个解压出的目录树迁入user/plugins/slug/或主题目录。再往后loadInstaller如果发现包根下存在install.php会require_once该文件并解析约定类名的安装器类——这意味着ZIP 内的任意 PHP 在解压后、安装流程中即可被解释器加载执行与禁止直接上传.php的假设形成断裂。3.2 [核心入口] 先看「流量落点」再看「Installer」废话不多说我们需要找到谁把不可信数据交给了解压器。漏洞描述可知将Web入口指到**/admin/tools/direct-install** 的**directInstall任务**。顺着这个接口往下追Admin插件最终会调用核心里的**Installer::install()。因此即使当前工作区没有Admin源码只要Grav核心**的Installer对ZIP采取「先解压、再信任」的策略任何复用该API的入口Admin、未来其他插件、甚至误暴露的封装都会继承同一风险。3.3-[逻辑缺陷]unZip解压即信任全局找定位到**system/src/Grav/Common/GPM/Installer.php是因为所有 GPM安装路径都要把包落到临时目录再迁入user/DirectInstallCommand里也能看到显式调用Installer::unZip($zip, $tmp_source)。**进unZip后可以看到打开归档后直接extractTo没有在循环里对**$zip-getNameIndex($i)**做安全判定——Zip Slip与包内任意文件两类问题在解压这都没有被拦。// system/src/Grav/Common/GPM/Installer.phppublicstaticfunctionunZip($zip_file,$destination){$zipnewZipArchive();$archive$zip-open($zip_file);if($archivetrue){Folder::create($destination);$unzip$zip-extractTo($destination);if(!$unzip){self::$errorself::ZIP_EXTRACT_ERROR;Folder::delete($destination);$zip-close();returnfalse;}$package_folder_name$zip-getNameIndex(0);// ...$zip-close();return$destination./.$package_folder_name;}// ...returnfalse;}这里的设计假设等价于ZIP与其中所有相对路径都是可信的extractTo在PHP层会按条目名写盘外层禁止.php上传无法约束压缩包内的evil.php、../../html/shell.php的检查3.4-[逻辑缺陷]loadInstallerrequire_once包内install.php接着往下看**Installer::install在文件复制/移动之前会调用loadInstaller。若根存在install.php核心会require_once相当于把是否执行这段PHP的裁决权交给了**ZIP作者。// system/src/Grav/Common/GPM/Installer.phpprivatestaticfunctionloadInstaller($installer_file_folder,$is_install){$installer_file_folderrtrim($installer_file_folder,DS);$install_file$installer_file_folder.DS.install.php;if(!file_exists($install_file)){returnnull;}require_once$install_file;很多CMS把install.php当作可信物里的安装钩子但在直接安装 接受任意ZIP的语义下这一钩子变成了即时代码执行点即便主插件PHP尚未被路由访问require_once已在服务端完成一次解释执行攻击面比仅写盘、待访问更靠前。3.5-[攻击子链] Grav 整包升级路径中的includeCLI DirectInstallCommand::upgradeGrav对类型为**grav的包会include解压目录下的system/install.php**并执行返回的callable。// system/src/Grav/Console/Gpm/DirectInstallCommand.phpprivatefunctionupgradeGrav(string$zip,string$folder):void{if(!is_dir($folder)){Installer::setError(Invalid source folder);}try{$script$folder./system/install.php;/** Install $installer */if((file_exists($script)$installinclude$script)is_callable($install)){$install($zip);}else{thrownewRuntimeException(Uploaded archive file is not a valid Grav update package);}这条链路常需要能执行CLI的权限与HTTP Admin的威胁模型不太一样但说明执行解压产物中的PHP是GPM的结构性选择审计时不可忽视运维侧滥用或被入侵账户利用bin/gpm的场景。3.6-推导最大危害在已具备管理员账号的前提下可以构造结构符合Grav插件约定的恶意包含blueprints.yaml、主类PHP等在**onPluginsInitialized等周期钩子里写WebShell、读配置中的数据库口令、或横向改写站点文件**。这与后台本来就能改模板不同任意PHP在服务器进程身份下运行可调用system、proc_open、读/etc/passwd在权限允许时等属于全站失陷。若攻击者通过CSRF、会话固定或stolen cookie 借用管理员浏览器也能让用户无感知下完成上传放大社工与浏览器侧风险。也同下面的漏洞3.7-Login插件问题根本原因在register()方法中groups和access字段仅在输入数据中不存在时才会被设置为配置默认值// Line 254-260if(!isset($data[groups])){$groups(array)$this-config-get(plugins.login.user_registration.groups,[]);if(count($groups)0){$data[groups]$groups;}}// Line 262-267if(!isset($data[access])){$access(array)$this-config-get(plugins.login.user_registration.access.site,[]);if(count($access)0){$data[access][site]$access;}}如果攻击者在POST请求体中包含了groups或access!isset()检查将返回false从而跳过配置默认值的设置攻击者提供的值将原封不动地传递下去。随后这些值会被直接赋给用户对象if(isset($data[groups])){$user-groups$data[groups];// attacker-controlled}if(isset($data[access])){$user-access$data[access];// attacker-controlled}$user-save();validateField()方法包含一个switch语句仅对以下字段进行验证username、password、password2、permissions、state和language。groups和access字段会落入default分支完全不受任何验证。# user/config/plugins/login.yamluser_registration: enabled:truefields: - username - password - email - fullname -groups# ← 启用攻击- access# ← 启用攻击3.8-攻击链路未认证攻击者 │ ├─[1]发送恶意注册请求(CVE-2026-42613)│ POST /user_register │ 注入 data[groups][]adminsdata[access][admin][super]true │ └─ Login 插件 register()方法未校验 groups/access → 写入用户 YAML │ ├─[2]获得 admin.super 超级管理员账户 │ 如 attacker / Str0ngPss! │ ├─[3]登录管理后台 /admin │ 获取 login-nonce → 提交凭证 → 建立会话 │ ├─[4]上传恶意插件 ZIP(CVE-2026-42607)│ POST /admin/tools/direct-install?taskdirectInstall │ └─ AdminController::taskDirectInstall()接收文件 → 调用 Installer::install()│ └─ Installer::unZip()使用 ZipArchive::extractTo()直接解压无文件类型/路径检查 │ └─ 插件文件落地至 user/plugins/shellplugin/ │ ├─[5]插件初始化触发 │ Grav 加载插件 → 执行 shellplugin.php 中的 onPluginsInitialized()│ └─ 恶意代码在插件目录写入 Webshell如 shell.php │ └─[6]远程命令执行 访问 /user/plugins/shellplugin/shell.php?cmdwhoami → 系统命令执行服务器完全控制0x4 修复建议1、升级最新版本将Grav升级至2.0.0-beta.2及以上版本https://github.com/getgrav/grav2、临时防护措施限制访问对 /admin/tools/direct-install 做IP白名单或额外HTTP认证仅维护窗口开放审计监控部署文件完整性监控监控user/plugins/**与Web根新建.php或者全站运维策略对更新包只做 签名校验后的安装。防火墙 / WAF拦截或告警POSTURI含direct-install taskdirectInstall multipart的组合对uploaded_file带.zip的上传加强审计与速率限制免责声明本文仅用于安全研究目的未经授权不得用于非法渗透测试活动。

相关文章:

Grav CMS 组合拳漏洞| CVE-2026-42613CVE-2026-42607复现研究

0x0 背景介绍 Grav是一个基于文件的Web平台。 在2.0.0-beta.2之前版本中,存在两个高危漏洞可导致组合利用权限提升漏洞->CVE-2026-42613 Grav的Login插件在处理用户注册请求时,未对请求数据中的groups/access字段进行服务端校验。当管理员在插件配置中…...

终极指南:免费解锁WeMod高级功能的完整方案

终极指南:免费解锁WeMod高级功能的完整方案 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod Pro的订阅费用而犹豫吗?…...

从AD9288到STM32H750:手把手拆解开源示波器osc_fun的硬件架构与选型思路

从AD9288到STM32H750:开源示波器osc_fun的硬件架构深度解析与工程实践 在开源硬件领域,osc_fun示波器项目以其精巧的架构设计和出色的性价比,成为众多硬件开发者研究的热点。这个看似简单的示波器背后,隐藏着一系列精妙的硬件选型…...

ClawLite:一键简化OpenClaw AI Agent框架的安装与成本优化

1. 项目概述:ClawLite,让OpenClaw的安装与上手变得简单 如果你对AI Agent(智能体)感兴趣,尤其是听说过OpenClaw这个强大的开源项目,但又被它复杂的命令行安装、环境配置和晦涩的文档劝退,那么Cl…...

ARM GICD_CTLR寄存器详解与中断控制实践

1. GICD_CTLR寄存器概述GICD_CTLR是ARM通用中断控制器(GIC)中Distributor模块的核心控制寄存器,作为中断系统的"总开关",它直接决定了整个中断控制器的行为模式。在GICv3/v4架构中,这个32位寄存器主要实现三大核心功能:…...

LLM-PDF开源工具:高质量文档解析与结构化处理实战指南

1. 项目概述:当LLM遇上PDF,一个开源工具如何重塑文档处理流程最近在折腾一个项目,需要让大语言模型(LLM)去理解一批技术规格书和合同文档。这事儿听起来简单,不就是把PDF扔给模型,让它读吗&…...

LinkSwift网盘直链下载助手:八大平台高速下载解决方案

LinkSwift网盘直链下载助手:八大平台高速下载解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...

社交媒体运营实战指南:从策略定位到数据分析的完整闭环

1. 项目概述:从“会发”到“会运营”的社交媒体技能跃迁“社交发布技能”,听起来像是一个老生常谈的话题。谁还不会发个朋友圈、微博或者小红书呢?但如果你把“tang-vu/social-posting-skills”这个项目标题,仅仅理解为“如何写一…...

MiGPT小爱音箱AI升级终极指南:5步快速接入ChatGPT和豆包大模型

MiGPT小爱音箱AI升级终极指南:5步快速接入ChatGPT和豆包大模型 【免费下载链接】mi-gpt 🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 你是否曾希望家中的小…...

Kubernetes智能运维助手:基于LLM的kube-copilot实战指南

1. 项目概述:当Kubernetes遇上AI副驾驶如果你和我一样,每天都要和Kubernetes集群打交道,那你肯定对下面这些场景不陌生:凌晨三点被告警叫醒,面对一个不断重启的Pod,需要手动执行一串kubectl describe、kube…...

数字通信系统核心:从IQ调制到星座图,深入解析PSK/QAM的实现与优化

1. 数字通信系统的核心:IQ调制揭秘 第一次接触IQ调制这个概念时,我也被它绕晕了。什么同相分量、正交分量,听起来就像天书。直到有一天,我在调试无线电设备时突然想通:这不就是把数字信号"画"在旋转的圆盘上…...

AI编程助手如何通过MCP协议安全访问本地代码库

1. 项目概述:一个连接代码与AI的“翻译官”最近在折腾AI编程助手的时候,发现了一个挺有意思的东西:semihkayan/codeweave-mcp。这名字乍一看有点唬人,又是“code weave”(代码编织)又是“MCP”的&#xff0…...

Web 安全深入审计检查清单

一、审计准备与范围界定 适用于渗透测试、安全评估及合规审计(如等保、ISO 27001):检查项具体内容授权确认获取书面授权书(RoE),明确测试时间、IP/域名范围、测试深度资产梳理主站、子域、API 端点、CDN、W…...

如何用本地AI技术实现视频硬字幕的高效提取:video-subtitle-extractor实战指南

如何用本地AI技术实现视频硬字幕的高效提取:video-subtitle-extractor实战指南 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包…...

Arm物联网战略转型:从IP授权到端到端生态构建的机遇与挑战

1. 从IP供应商到生态构建者:Arm的物联网战略转型解析最近在梳理半导体行业动态时,Arm的一则旧闻让我思考了很久。2018年,这家以处理器IP授权闻名的公司,被曝出计划以6亿美元收购数据分析公司Treasure Data。这并非孤例&#xff0c…...

3步掌握Blender 3MF插件:构建高效3D打印工作流

3步掌握Blender 3MF插件:构建高效3D打印工作流 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 在3D打印和数字制造领域,模型格式转换是连接设计与…...

Equalizer APO终极指南:如何免费打造专业级音频系统

Equalizer APO终极指南:如何免费打造专业级音频系统 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo 你是否曾想过,只需一款免费软件就能让普通音响系统释放出专业级的音质表现&a…...

如何在浏览器中高效使用微信网页版:浏览器扩展的终极解决方案

如何在浏览器中高效使用微信网页版:浏览器扩展的终极解决方案 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为无法在浏览器中直接使…...

VideoRAG框架解析:基于知识图谱的超长视频理解与对话系统

1. 项目概述:当视频太长,AI也“看”不过来时,我们做了什么作为一名长期混迹在AI和多媒体技术交叉领域的开发者,我经常遇到一个头疼的问题:现在的多模态大模型(MLLM)处理图片、理解短视频都挺溜&…...

深入Logos FPGA的PCB布局:如何针对FBG256、FBG484和LPG封装优化你的设计

深入Logos FPGA的PCB布局:如何针对FBG256、FBG484和LPG封装优化你的设计 在硬件设计领域,FPGA的PCB布局一直是工程师面临的核心挑战之一。特别是当项目需要在性能、成本和尺寸之间寻找平衡点时,封装选择往往成为决定成败的关键因素。Logos系列…...

AI记忆系统健康管理:行为数据驱动的OpenClaw记忆污染解决方案

1. 项目概述:为AI记忆系统装上“听诊器”如果你正在用OpenClaw,或者任何类似的AI智能体开发框架,那你肯定对它的记忆系统又爱又恨。爱的是,它能记住你项目里的关键代码片段、常用指令,下次对话时能直接调出来用&#x…...

NotebookLM私有知识库安全加固指南(GDPR/等保2.0双合规配置手册,仅限内部技术团队流通)

更多请点击: https://intelliparadigm.com 第一章:NotebookLM私有知识库安全加固概览 NotebookLM 是 Google 推出的基于用户上传文档进行语义理解与问答的 AI 工具,其本地化部署或私有知识库场景下,数据驻留、访问控制与内容脱敏…...

3分钟掌握PPT演示时间管理的终极方案:智能悬浮计时器

3分钟掌握PPT演示时间管理的终极方案:智能悬浮计时器 【免费下载链接】ppttimer 一个简易的 PPT 计时器 项目地址: https://gitcode.com/gh_mirrors/pp/ppttimer 在演讲、汇报、教学等场景中,时间管理是成功的关键因素。PPTTimer作为一款专为Wind…...

基于MCP协议与SearXNG构建AI智能体私有化搜索接口

1. 项目概述:一个为AI智能体打造的“搜索引擎接口”最近在折腾AI智能体(Agent)开发的朋友,可能都听说过MCP(Model Context Protocol)这个协议。简单来说,它就像给AI智能体装上了一套标准化的“插…...

【ElevenLabs企业级接入白皮书】:基于17个生产环境案例验证的鉴权体系重构、多租户语音隔离与GDPR合规审计清单

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs企业级接入的演进动因与白皮书方法论 企业语音合成需求正从“能发声”跃迁至“有角色、可治理、可审计、可集成”。ElevenLabs 企业级 API 的演进并非单纯性能叠加,而是响应 GDPR…...

PheroPath:基于规则与数据库比对的生物信息素合成通路预测工具解析

1. 项目概述与核心价值 最近在生物信息学和药物发现领域,一个名为“PheroPath”的项目在GitHub上引起了我的注意。这个项目由用户starpig1129开源,其核心目标是构建一个用于预测和可视化信息素(Pheromone)生物合成通路的工具。乍一…...

构建个人知识记忆桥梁:从数据抽取到智能检索的工程实践

1. 项目概述:一个连接记忆与未来的桥梁最近在开源社区里,我注意到一个挺有意思的项目,叫leninejunior/engrene-memory-bridge。光看这个名字,就透着一股子“连接”和“记忆”的味道。作为一个长期在数据工程和知识管理领域摸爬滚打…...

AI编程助手技能化:开源agent-skills项目实战指南

1. 项目概述:为AI编程助手注入“专业技能包” 如果你和我一样,日常重度依赖 Claude Code、Cursor 这类 AI 编程助手来辅助开发和研究,那你肯定遇到过这样的场景:想让 AI 帮你深入理解一篇复杂的数学论文,或者验证一个…...

基于向量检索的代码语义搜索:从原理到CodeIndexer实战部署

1. 项目概述:一个为代码库建立语义索引的利器最近在折腾一个老项目的代码重构,面对几十万行混杂着不同语言和框架的代码,想快速定位一个特定功能的实现逻辑,或者查找所有使用了某个第三方库的模块,简直像大海捞针。传统…...

ClawShelf:打造精准可控的本地媒体库元数据管理方案

1. 项目概述:一个为极客打造的本地媒体资产管理利器如果你和我一样,是个喜欢折腾本地影音库、又对现有媒体管理工具(比如Plex、Jellyfin的刮削器)的识别准确率或自定义能力感到不满的资深玩家,那么你很可能已经对“Cla…...