Supabase 보안
Reading time: 6 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를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
기본 정보
그들의 랜딩 페이지에 따르면: Supabase는 오픈 소스 Firebase 대안입니다. Postgres 데이터베이스, 인증, 즉시 API, 엣지 함수, 실시간 구독, 스토리지 및 벡터 임베딩으로 프로젝트를 시작하세요.
서브도메인
기본적으로 프로젝트가 생성되면 사용자는 **jnanozjdybtpqgcwhdiz.supabase.co
**와 같은 supabase.co 서브도메인을 받게 됩니다.
데이터베이스 구성
tip
이 데이터는 https://supabase.com/dashboard/project/<project-id>/settings/database
와 같은 링크에서 접근할 수 있습니다.
이 데이터베이스는 일부 AWS 리전에서 배포되며, 연결하기 위해서는 다음과 같이 연결할 수 있습니다: postgres://postgres.jnanozjdybtpqgcwhdiz:[YOUR-PASSWORD]@aws-0-us-west-1.pooler.supabase.com:5432/postgres
(이것은 us-west-1에서 생성되었습니다).
비밀번호는 사용자가 이전에 입력한 비밀번호입니다.
따라서 서브도메인이 알려진 것이고 사용자 이름으로 사용되며 AWS 리전이 제한적이기 때문에 비밀번호를 무작위 대입 공격할 가능성이 있을 수 있습니다.
이 섹션에는 다음과 같은 옵션도 포함되어 있습니다:
- 데이터베이스 비밀번호 재설정
- 연결 풀링 구성
- SSL 구성: 평문 연결 거부 (기본적으로 활성화되어 있음)
- 디스크 크기 구성
- 네트워크 제한 및 금지 적용
API 구성
tip
이 데이터는 https://supabase.com/dashboard/project/<project-id>/settings/api
와 같은 링크에서 접근할 수 있습니다.
프로젝트에서 supabase API에 접근하는 URL은 다음과 같을 것입니다: https://jnanozjdybtpqgcwhdiz.supabase.co
.
anon API 키
또한 anon API 키(role: "anon"
)를 생성합니다, 예: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTQ5OTI3MTksImV4cCI6MjAzMDU2ODcxOX0.sRN0iMGM5J741pXav7UxeChyqBE9_Z-T0tLA9Zehvqk
이 애플리케이션이 API 키에 접근하기 위해 사용해야 합니다.
이 API에 연락하기 위한 API REST를 문서에서 찾을 수 있지만, 가장 흥미로운 엔드포인트는 다음과 같습니다:
가입 (/auth/v1/signup)
``` POST /auth/v1/signup HTTP/2 Host: id.io.net Content-Length: 90 X-Client-Info: supabase-js-web/2.39.2 Sec-Ch-Ua: "Not-A.Brand";v="99", "Chromium";v="124" Sec-Ch-Ua-Mobile: ?0 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTQ5OTI3MTksImV4cCI6MjAzMDU2ODcxOX0.sRN0iMGM5J741pXav7UxeChyqBE9_Z-T0tLA9Zehvqk User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.60 Safari/537.36 Content-Type: application/json;charset=UTF-8 Apikey: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTQ5OTI3MTksImV4cCI6MjAzMDU2ODcxOX0.sRN0iMGM5J741pXav7UxeChyqBE9_Z-T0tLA9Zehvqk Sec-Ch-Ua-Platform: "macOS" Accept: */* Origin: https://cloud.io.net Sec-Fetch-Site: same-site Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Referer: https://cloud.io.net/ Accept-Encoding: gzip, deflate, br Accept-Language: en-GB,en-US;q=0.9,en;q=0.8 Priority: u=1, i{"email":"test@exmaple.com","password":"SomeCOmplexPwd239."}
</details>
<details>
<summary>로그인 (/auth/v1/token?grant_type=password)</summary>
POST /auth/v1/token?grant_type=password HTTP/2 Host: hypzbtgspjkludjcnjxl.supabase.co Content-Length: 80 X-Client-Info: supabase-js-web/2.39.2 Sec-Ch-Ua: "Not-A.Brand";v="99", "Chromium";v="124" Sec-Ch-Ua-Mobile: ?0 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTQ5OTI3MTksImV4cCI6MjAzMDU2ODcxOX0.sRN0iMGM5J741pXav7UxeChyqBE9_Z-T0tLA9Zehvqk User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.60 Safari/537.36 Content-Type: application/json;charset=UTF-8 Apikey: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTQ5OTI3MTksImV4cCI6MjAzMDU2ODcxOX0.sRN0iMGM5J741pXav7UxeChyqBE9_Z-T0tLA9Zehvqk Sec-Ch-Ua-Platform: "macOS" Accept: / Origin: https://cloud.io.net Sec-Fetch-Site: same-site Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Referer: https://cloud.io.net/ Accept-Encoding: gzip, deflate, br Accept-Language: en-GB,en-US;q=0.9,en;q=0.8 Priority: u=1, i
{"email":"test@exmaple.com","password":"SomeCOmplexPwd239."}
</details>
그래서, 클라이언트가 부여받은 서브도메인으로 supabase를 사용하는 것을 발견할 때마다 (회사의 서브도메인이 그들의 supabase 서브도메인에 CNAME을 가질 가능성이 있음), **supabase API를 사용하여 플랫폼에 새 계정을 생성**해 볼 수 있습니다.
### 비밀 / 서비스 역할 API 키
**`role: "service_role"`**로 비밀 API 키도 생성됩니다. 이 API 키는 **Row Level Security**를 우회할 수 있기 때문에 비밀이어야 합니다.
API 키는 다음과 같습니다: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTcxNDk5MjcxOSwiZXhwIjoyMDMwNTY4NzE5fQ.0a8fHGp3N_GiPq0y0dwfs06ywd-zhTwsm486Tha7354`
### JWT 비밀
**JWT 비밀**도 생성되어 애플리케이션이 **사용자 정의 JWT 토큰을 생성하고 서명**할 수 있습니다.
## 인증
### 가입
<div class="mdbook-alerts mdbook-alerts-tip">
<p class="mdbook-alerts-title">
<span class="mdbook-alerts-icon"></span>
tip
</p>
기본적으로 supabase는 **새 사용자가 프로젝트에 계정을 생성**할 수 있도록 이전에 언급한 API 엔드포인트를 사용합니다.
</div>
그러나 이러한 새 계정은 기본적으로 **로그인하기 위해 이메일 주소를 확인해야** 합니다. 이메일 주소 확인 없이 로그인할 수 있도록 **"익명 로그인 허용"**을 활성화할 수 있습니다. 이는 **예상치 못한 데이터**에 대한 접근을 허용할 수 있습니다 (그들은 `public` 및 `authenticated` 역할을 받습니다).\
이는 supabase가 활성 사용자당 요금을 부과하기 때문에 매우 나쁜 아이디어입니다. 사람들이 사용자를 생성하고 로그인할 수 있으며 supabase는 이에 대해 요금을 부과할 것입니다:
<figure><img src="../images/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
### 비밀번호 및 세션
최소 비밀번호 길이(기본값), 요구 사항(기본값 없음)을 지정하고 유출된 비밀번호 사용을 금지할 수 있습니다.\
기본 요구 사항이 약하기 때문에 **요구 사항을 개선하는 것이 좋습니다**.
- 사용자 세션: 사용자 세션 작동 방식을 구성할 수 있습니다 (타임아웃, 사용자당 1세션...)
- 봇 및 남용 보호: Captcha를 활성화할 수 있습니다.
### SMTP 설정
이메일을 보내기 위해 SMTP를 설정할 수 있습니다.
### 고급 설정
- 액세스 토큰의 만료 시간 설정 (기본값 3600)
- 잠재적으로 손상된 새로 고침 토큰을 감지하고 취소하는 설정 및 타임아웃
- MFA: 사용자당 한 번에 등록할 수 있는 MFA 요소 수를 지정 (기본값 10)
- 최대 직접 데이터베이스 연결: 인증에 사용되는 최대 연결 수 (기본값 10)
- 최대 요청 지속 시간: 인증 요청이 지속될 수 있는 최대 시간 (기본값 10초)
## 저장소
<div class="mdbook-alerts mdbook-alerts-tip">
<p class="mdbook-alerts-title">
<span class="mdbook-alerts-icon"></span>
tip
</p>
Supabase는 **파일을 저장**하고 URL을 통해 접근할 수 있도록 합니다 (S3 버킷을 사용합니다).
</div>
- 업로드 파일 크기 제한 설정 (기본값 50MB)
- S3 연결은 다음과 같은 URL로 제공됩니다: `https://jnanozjdybtpqgcwhdiz.supabase.co/storage/v1/s3`
- `access key ID` (예: `a37d96544d82ba90057e0e06131d0a7b`)와 `secret access key` (예: `58420818223133077c2cec6712a4f909aec93b4daeedae205aa8e30d5a860628`)로 구성된 **S3 액세스 키를 요청**할 수 있습니다.
## 엣지 함수
supabase에 **비밀을 저장**할 수 있으며, 이는 **엣지 함수에 의해 접근 가능**합니다 (웹에서 생성 및 삭제할 수 있지만, 그 값에 직접 접근할 수는 없습니다).
<div class="mdbook-alerts mdbook-alerts-tip">
<p class="mdbook-alerts-title">
<span class="mdbook-alerts-icon"></span>
tip
</p>
AWS 해킹 배우기 및 연습하기:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
GCP 해킹 배우기 및 연습하기: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
Azure 해킹 배우기 및 연습하기: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
<details>
<summary>HackTricks 지원하기</summary>
- [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
- **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우하세요.**
- **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.**
</details>
</div>