Grafana Post-Auth DuckDB SQL 注入(文件读取)

使用 Grafana(一种开源数据可视化和监控解决方案,可推动明智的决策、提高系统性能并简化故障排除)通过漂亮的仪表板轻松收集、关联和可视化数据。Grafana 实验性 SQL 表达式功能中的一个 DuckDB SQL 注入漏洞。任何经过身份验证的用户都可以通过修改 Grafana 仪表板中的表达式执行任意 DuckDB SQL 查询。

描述

使用 Grafana(一种开源数据可视化和监控解决方案,可推动明智的决策、提高系统性能并简化故障排除)通过漂亮的仪表板轻松收集、关联和可视化数据。

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

漏洞分析

根据描述,得知漏洞点在仪表盘创建处。这里可以输入表达式,执行一些函数命令。

image-20241021163300106.png
先从代码分析一下。

通过抓包,获取该功能路径如下:

http://localhost:3000/api/ds/query?ds_type=__expr__&expression=true&requestId=Q121

image-20241021163439547.png

在框中输入aaa,查询数据如下

image-20241021163534893.png

可以直接在GitHub下载源码https://github.com/grafana/grafana/releases,该系统通过go进行编写,找到项目的路由定义处,找到该接口对应的路由。

image-20241021163810779.png

这个路由处理器是用来处理 /ds/query 路径的 POST 请求,具体执行几个操作,例如:

  1. requestmeta.SetSLOGroup:为请求设置服务级别目标 (SLO),在这里是 SLOGroupHighSlow,意味着这个请求可能对服务性能有较高要求,但可能有一定的延迟。
  2. authorize:对请求进行授权,使用 ac.EvalPermission 来评估权限,这里似乎是在检查是否有 datasources.ActionQuery 的权限。
  3. hs.getDSQueryEndpoint():这是路由的实际处理函数,会处理发到 /ds/query 路由的请求。

接着找到getDSQueryEndpoint函数,处理逻辑并不在这个函数,还需要进一步跟踪。

image-20241021164002356.png

当有表达式时,handleExpressions 处理 POST /api/ds/query

image-20241021164315759.png

最终sql表达式在SQLCommand.Execute中执行

image-20241021164739396.png

这里整个过程中没有进行任何过滤,可以执行任意的duckDB命令,可执行的命令参考官网:https://duckdb.org/docs/sql/functions/utility

image-20241021164943141.png

漏洞复现

执行payload: SELECT content FROM read_blob('/etc/passwd')

b84bce0d7f66a88a626c2fd27dc473ce7fefc6e8.png

总结

官方已经以进行了修复,直接把duckDB功能给去掉了。非常的简单粗暴。

image-20241021165346751.png

image-20241021165501703.png

  • 发表于 2024-10-30 10:00:02
  • 阅读 ( 10186 )
  • 分类:Web应用

0 条评论

请先 登录 后评论
la0gke
la0gke

9 篇文章

站长统计