pedroalmeidap/nuclei-templates-supabase
GitHub: pedroalmeidap/nuclei-templates-supabase
一组针对 Supabase RLS 错误配置的 Nuclei 检测模板,利用公开的 anon key 自动发现未保护的数据表和敏感字段泄露。
Stars: 0 | Forks: 0
# Nuclei Templates — Supabase RLS 错误配置
用于检测通过 anon key 暴露的 Supabase 实例中 Row Level Security (RLS) 配置情况的模板。
## 背景
Supabase 的 anon key **在设计上是公开的** —— 它被嵌入在前端 JS 打包文件中。问题不在于密钥本身,而在于它能够访问哪些内容。
当创建的表未启用 RLS,或者使用了 `USING (true)` 策略时,任何拥有 anon key 的人都可以通过 REST API (`/rest/v1/`) 读取所有记录。
## 模板
| 模板 | 严重程度 | 检测内容 |
|---|---|---|
| `supabase-anon-key-data-exposure.yaml` | High | 通过 anon key 返回任意数据的表 |
| `supabase-sensitive-fields-exposure.yaml` | Critical | 暴露的敏感字段 (Stripe, CPF, plans, commissions) |
| `supabase-rls-disabled-check.yaml` | High | 未启用 RLS 的表 (通过 Content-Range 返回计数) |
## 前置条件
```
# 安装 Nuclei
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
# 或者通过 brew
brew install nuclei
```
## 如何获取 anon key
anon key 位于前端的 JS 打包文件中。要找到它:
1. 使用 Burp Suite 或 DevTools (网络) 在浏览器中打开网站
2. 导航到使用身份验证的页面(例如:密码重置、登录)
3. 在请求中过滤 `supabase.co`
4. anon key 会出现在 `apikey` 和 `Authorization` 请求头中
或者,在 JS 块中搜索 `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9`(Supabase JWT 的标准前缀)。
## 用法
### 运行所有模板
```
nuclei -t . \
-var anon_key="eyJhbGci..." \
-var supabase_url="https://SEU-ID.supabase.co" \
-o resultados.txt
```
### 运行特定模板
```
# 搜索任何暴露的数据
nuclei -t supabase-anon-key-data-exposure.yaml \
-var anon_key="eyJhbGci..." \
-var supabase_url="https://SEU-ID.supabase.co"
# 聚焦于敏感字段(Stripe、PII、计划)
nuclei -t supabase-sensitive-fields-exposure.yaml \
-var anon_key="eyJhbGci..." \
-var supabase_url="https://SEU-ID.supabase.co"
# 检测未启用 RLS 的表
nuclei -t supabase-rls-disabled-check.yaml \
-var anon_key="eyJhbGci..." \
-var supabase_url="https://SEU-ID.supabase.co"
```
### 使用自定义字典
```
nuclei -t supabase-anon-key-data-exposure.yaml \
-var anon_key="eyJhbGci..." \
-var supabase_url="https://SEU-ID.supabase.co" \
-var table=minha_tabela
```
## 字典
`wordlists/saas-tables-pt.txt` — 包含约 200 个巴西 SaaS/BaaS 中常见表名的列表,涵盖:
- 多租户 (tenants, empresas, workspaces)
- 支付 (stripe_customers, subscriptions, invoices)
- CRM (clients, clientes, leads, contacts)
- 预约 (appointments, bookings, availability)
- 健康/Healthtech (anamnesis, patients, prontuarios)
- 教育/在线学习 (courses, enrollments, students)
- 营销 (campaigns, content_items, funnels)
- 联盟/推荐 (affiliates, mentor_profiles, commissions)
## 手动验证
发现暴露的表后,请手动验证:
```
# 统计记录数
curl 'https://SEU-ID.supabase.co/rest/v1/TABELA?select=count' \
-H "apikey: SUA_ANON_KEY" \
-H "Authorization: Bearer SUA_ANON_KEY" \
-H "Prefer: count=exact"
# 检查 header Content-Range: */TOTAL
# 读取数据(使用安全 limit 作为证据)
curl 'https://SEU-ID.supabase.co/rest/v1/TABELA?select=*&limit=1' \
-H "apikey: SUA_ANON_KEY" \
-H "Authorization: Bearer SUA_ANON_KEY"
```
## 修复
```
-- 1. Habilitar RLS na tabela
ALTER TABLE nome_da_tabela ENABLE ROW LEVEL SECURITY;
-- 2. Remover política permissiva
DROP POLICY IF EXISTS nome_da_policy ON nome_da_tabela;
-- 3. Auditar todas as tabelas sem RLS
SELECT tablename, rowsecurity
FROM pg_tables
WHERE schemaname = 'public' AND rowsecurity = false;
-- 4. Auditar políticas permissivas
SELECT tablename, policyname, qual
FROM pg_policies
WHERE schemaname = 'public' AND qual = 'true';
```
## 负责任的使用
这些模板旨在用于:
- 经过授权范围的渗透测试
- 自有环境的审计
- 防御性安全研究
- 将 Supabase 纳入范围的 Bug Bounty 计划
请勿在未经明确授权的情况下将其用于系统。
标签:API安全, CISA项目, Google, Go语言, GraphQL安全矩阵, JSON输出, JWT安全, Maven, Nuclei, Nuclei-Templates, PII泄露, REST API, RLS, StruQ, Supabase, URL发现, Web安全, 前端安全, 安全扫描器, 安全检测, 敏感信息暴露, 数据展示, 日志审计, 漏洞验证, 程序破解, 红队, 网络安全, 蓝队分析, 行级安全策略, 隐私保护