用途
hunt-supabase 是一个针对 Supabase 的安全测试技能,用于在授权范围内发现和验证 Supabase 项目中的配置缺陷。Supabase 是开源的 Firebase 替代方案,使用行级安全(RLS)进行访问控制,但 RLS 策略经常被错误配置,尤其是在快速开发栈(如 Lovable.dev、Bolt.new、Cursor)中。该技能围绕 anon key 发现、REST API 表枚举、RLS 绕过、认证利用和存储桶探测等环节展开。
主要能力
该技能覆盖以下高价值发现类型:
- 通过 anon key 访问公开表:当 RLS 被禁用或策略过于宽松时,REST API 配合 anon key 可返回表数据,属于严重级别。
- 通过 organization_id 绕过 RLS:UPDATE 操作检查用户所有权但不检查 organization_id,导致跨租户数据访问,属于严重级别。
- RPC 函数返回全局数据:SECURITY DEFINER 的 RPC 函数未按 auth.uid() 过滤,返回所有用户数据,属于高级别。
- 无 RLS 的存储桶:公开文件列表、上传和下载,属于高级别。
- 开放注册:任何人都可以注册并获得 JWT,属于高级别。
- 多租户枚举:同一开发者构建的多个应用存在相同的 RLS 缺陷,属于中级别。
使用方式
技能按阶段组织:
- 定位 Supabase 项目:通过 JS 打包文件、.env 和配置文件、source map 搜索 Supabase URL 格式(https://[PROJECT_REF].supabase.co)和 anon key 格式(以 eyJ 开头的 JWT)。
- Supabase 侦察:验证项目存在、获取 OpenAPI/Swagger 规范、尝试列出所有表、测试常见表名。
- 使用 anon key 枚举数据:读取表数据、分页、选择特定列、过滤行、统计行数,并尝试写入(插入、更新、删除)。
- 通过 organization_id 操纵绕过 RLS:利用 UPDATE 操作进行跨组织 IDOR,调用无组织过滤的 RPC 函数,通过 WHOIS 和 crt.sh 进行多租户枚举。
- Supabase 认证利用:检测开放注册、从注册响应提取 JWT、通过注册错误差异进行用户枚举。
- Supabase 存储利用:列出存储桶、列出文件、下载文件、测试上传、获取公开 URL。
- 攻击链:组合 anon key 泄露、开放注册、RLS 绕过和 RPC 函数形成完整攻击路径。
技能还包含错误提示枚举(Error Hint Enumeration)方法,利用 PostgREST 在查询不存在的表时返回的表名提示来映射整个 Supabase schema。
适用场景
适用于授权范围内的渗透测试、安全审计和漏洞赏金项目,特别是针对使用 Supabase 作为后端的 Web 应用。重点场景包括多租户应用、快速开发栈构建的应用,以及存在 anon key 暴露或 RLS 配置缺陷的项目。
限制
- anon key 本身是设计为公开的,它授予的是受 RLS 限制的访问;真正的发现是 RLS 策略缺失。
- 公开存储桶配合 RLS 绕过:如果 RLS 策略允许公开读取存储,那是设计意图;需要访问本应私有的数据才算发现。
- Supabase URL 和 anon key 是配置值而非秘密;影响程度取决于 anon key 通过缺失的 RLS 能访问什么。
- Supabase 实时订阅不涉及敏感数据:订阅公开频道是预期行为;需要订阅私有频道才算发现。
- 该技能仅提供测试方法和命令,不保证任何特定目标存在漏洞。
- 所有测试必须在获得明确授权的前提下进行。