# GCP - Bigquery Enum

{{#include ../../../banners/hacktricks-training.md}}

## Basiese Inligting

Google Cloud BigQuery is 'n **volledig bestuurde, serverlose ondernemingsdata-berging**, wat vermoëns bied vir **analise oor petabytes** van data, en hanteer groot skaal datasets doeltreffend. As 'n Platform as a Service (PaaS), bied dit gebruikers infrastruktuur en gereedskap om data bestuur te fasiliteer sonder die behoefte aan handmatige toesig.

Dit ondersteun navraag met behulp van **ANSI SQL**. Die hoofobjekte is **datasets** wat **tabelle** bevat wat SQL **data** bevat.

### Enkripsie

Standaard word 'n **Google-beheerde enkripsiesleutel** gebruik, alhoewel dit moontlik is om 'n **Kliënt-beheerde enkripsiesleutel (CMEK)** te konfigureer. Dit is moontlik om die enkripsiesleutel per dataset en per tabel binne 'n dataset aan te dui.

### Vervaldatum

Dit is moontlik om 'n **vervaltyd in die dataset** aan te dui sodat enige nuwe tabel wat in hierdie dataset geskep word, **automaties verwyder** sal word na die gespesifiseerde aantal dae na skep.

### Eksterne Bronne

Bigquery is diep geïntegreer met ander Google-dienste. Dit is moontlik om data van emmers, pub/sub, google drive, RDS-databasisse te laai...

### Dataset ACLs

Wanneer 'n dataset geskep word, **ACLs word aangeheg** om toegang daartoe te gee. Standaard word **Eienaar** regte gegee aan die **gebruiker wat** die dataset geskep het en dan **Eienaar** aan die groep **projectOwners** (Eienaars van die projek), **Skrywer** aan die groep **projectWriters,** en **Leser** aan die groep **projectReaders**:
```bash
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"
}
],
...
```
### Tabel Rye Beheer Toegang

Dit is moontlik om die **rye wat 'n prinsiep toegang gaan hê tot binne 'n tabel** te beheer met ry toegangbeleide. Hierdie word binne die tabel gedefinieer met [**DDL**](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_row_access_policy_statement).\
Die toegangbeleid definieer 'n filter en **slegs die ooreenstemmende rye** met daardie filter gaan **toeganklik** wees vir die aangeduide prinsiepe.
```sql
# 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
```

```bash
# Enumerate row policies on a table
bq ls --row_access_policies <proj>:<dataset>.<table> # Get row policies
```
### Kolomme Toegang Beheer

<figure><img src="../../../images/image (12).png" alt=""><figcaption></figcaption></figure>

Om data toegang op kolomvlak te beperk:

1. **Definieer 'n taksonomie en beleidsmerke**. Skep en bestuur 'n taksonomie en beleidsmerke vir jou data. [https://console.cloud.google.com/bigquery/policy-tags](https://console.cloud.google.com/bigquery/policy-tags)
2. Opsioneel: Ken die **Data Catalog Fine-Grained Reader rol aan een of meer principals** toe op een of meer van die beleidsmerke wat jy geskep het.
3. **Ken beleidsmerke aan jou BigQuery kolomme toe**. In BigQuery, gebruik skema annotasies om 'n beleidsmerk aan elke kolom toe te ken waar jy toegang wil beperk.
4. **Handhaaf toegangbeheer op die taksonomie**. Die handhawing van toegangbeheer veroorsaak dat die toegangbeperkings wat vir al die beleidsmerke in die taksonomie gedefinieer is, toegepas word.
5. **Bestuur toegang op die beleidsmerke**. Gebruik [Identity and Access Management](https://cloud.google.com/iam) (IAM) beleide om toegang tot elke beleidsmerk te beperk. Die beleid is van toepassing op elke kolom wat aan die beleidsmerk behoort.

Wanneer 'n gebruiker probeer om kolomdata tydens 'n navraag te bekom, **kontroleer BigQuery die kolom beleidsmerk en sy beleid om te sien of die gebruiker gemagtig is om toegang tot die data te hê**.

> [!TIP]
> As opsomming, om die toegang tot sekere kolomme vir sekere gebruikers te beperk, kan jy **'n merk aan die kolom in die skema voeg en die toegang** van die gebruikers tot die merk beperk deur toegangbeheer op die taksonomie van die merk af te dwing.

Om toegangbeheer op die taksonomie af te dwing, is dit nodig om die diens in te skakel:
```bash
gcloud services enable bigquerydatapolicy.googleapis.com
```
Dit is moontlik om die etikette van kolomme te sien met:
```bash
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"}]
```
### Enumerasie
```bash
# 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

Vir verdere inligting kan jy die blogpos nagaan: [https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac](https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac). Hier sal net 'n paar besonderhede gegee word.

**Kommentaar**:

- `select 1#from here it is not working`
- `select 1/*between those it is not working*/` Maar net die aanvanklike een sal nie werk nie
- `select 1--from here it is not working`

Kry **inligting** oor die **omgewing** soos:

- Huidige gebruiker: `select session_user()`
- Projek id: `select @@project_id`

Concat rye:

- Alle tabelname: `string_agg(table_name, ', ')`

Kry **datasets**, **tabelle** en **kolom** name:

- **Projek** en **dataset** naam:
```sql
SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
```
- **Kolom** en **tabel** name van **alle die tabelles** van die datastel:
```sql
# 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
```
- **Ander datastelle** in dieselfde projek:
```sql
# 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 tipes:**

- Foutgebaseer - casting: `select CAST(@@project_id AS INT64)`
- Foutgebaseer - deling deur nul: `' OR if(1/(length((select('a')))-1)=1,true,false) OR '`
- Unie-gebaseer (jy moet ALL in bigquery gebruik): `UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name#`
- Boolean-gebaseer: `` ' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'# ``
- Potensiële tydgebaseer - Gebruik van openbare datasets voorbeeld: `` SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000 ``

**Dokumentasie:**

- Alle funksielys: [https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators](https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators)
- Scripting verklarings: [https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting](https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting)

### Privilege Escalation & Post Exploitation

{{#ref}}
../gcp-privilege-escalation/gcp-bigquery-privesc.md
{{#endref}}

### Persistensie

{{#ref}}
../gcp-persistence/gcp-bigquery-persistence.md
{{#endref}}

## Verwysings

- [https://cloud.google.com/bigquery/docs/column-level-security-intro](https://cloud.google.com/bigquery/docs/column-level-security-intro)

{{#include ../../../banners/hacktricks-training.md}}
