前言
在现代数据驱动的世界中,数据安全和隐私保护变得越来越重要。Apache Superset 作为一个广泛使用的开源数据探索和可视化平台,其安全性尤其受到关注。本文将详细介绍我们在一次审计过程中发现的一个严重漏洞,以及如何利用这一漏洞绕过 Apache Superset 的安全措施,执行任意 SQL 查询。
什么是 Apache Superset?
Apache Superset 是一个开源平台,用于数据探索和可视化。它提供了一个无需编码的界面,用于快速图表制作,使用户能够在不编写复杂 SQL 查询的情况下探索数据。此外,Superset 还提供了一个基于 Web 的 SQL 编辑器,用于更高级的分析。尽管可以执行 SQL 查询,但并非所有操作都对用户开放,因为安全性和数据隔离是考虑的重要因素。
背景
在一次针对某企业 Web 应用的安全审计过程中,发现某企业的应用程序使用了Apache Superset(版本4.0.1,撰写本文时的最新版本)来展示数据图表和分析结果。通过分析应用程序与Burp之间的交互,发现可以与Apache Superset的API进行交互。
在进一步的测试中,发现可以通过以下API路径控制DBMS执行某些 SQL 查询:
/superset/explore_json/(使用 xpath_exists(xpath, xml [, nsarray]) 将基于时间的注入转换为基于错误的注入,该函数评估XPath 1.0表达式)
/api/v1/chart/data
需要注意的是,在Apache Superset中执行 SQL 查询是正常的,因为这是该应用程序的主要目的,并不被视为漏洞。这篇文章的目的是展示已识别的关于防止攻击者执行任意 SQL 请求的安全措施的弱点。
一旦用户(因此也是攻击者)试图执行任意请求,这些请求就会被安全机制阻止。
查看代码
为了确定阻塞的原因,只需从GitHub获取源代码。经过快速的代码审查,以下代码片段似乎检查查询是否包含任何子查询。
文件:superset/models/helpers.py
函数:validate_adhoc_subquery()
def validate_adhoc_subquery(
sql: str,
database_id: int,
default