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安全, 前端安全, 安全扫描器, 安全检测, 敏感信息暴露, 数据展示, 日志审计, 漏洞验证, 程序破解, 红队, 网络安全, 蓝队分析, 行级安全策略, 隐私保护