数据库
盘点 Supabase Storage Buckets…
在有 Supabase URL 和 anon key 的前提下,枚举所有 Storage Buckets,分析公开性、大小限制和 MIME 限制,发现存储攻击面并输出整改建议。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
盘点 Supabase Storage 特定
解决思路
- 在枚举开始前,向 `.sb-pentest-audit.log` 写入操作日志;枚举结束后也写入日志,格式包含 `[TIMESTAMP] [supabase-audit-buckets-list] [START] Listing storage buckets`、`[SUCCESS] Found X buckets`、`[CONTEXT_UPDATED] .sb-pentest-context.json updated` 等。
- 每发现一个 bucket 后,立即更新 `.sb-pentest-context.json`,不要等到技能结束再批量写入。
- 每分析完一个 bucket 配置后,立即把结果记录到 `.sb-pentest-audit.log`。
- 如果 `.sb-pentest-context.json` 或 `.sb-pentest-audit.log` 不存在,先创建再写入。
- 使用 `GET https://[project].supabase.co/storage/v1/bucket` 列出所有 storage buckets;请求头使用 `apikey: $ANON_KEY` 和 `Authorization: Bearer $ANON_KEY`。
- 对应 curl 命令:`curl -s "$SUPABASE_URL/storage/v1/bucket" -H "apikey: $ANON_KEY" -H "Authorization: Bearer $ANON_KEY"`。
- 记录 Supabase Storage 基础路径:`https://[project].supabase.co/storage/v1/`。
- 记住 Storage API 端点用途:`/storage/v1/bucket` 列出 buckets;`/storage/v1/object/list/[bucket]` 列出 bucket 中文件;`/storage/v1/object/[bucket]/[path]` 访问文件;`/storage/v1/object/public/[bucket]/[path]` 公开文件 URL。
- 理解 bucket 类型:Public 文件无需认证即可访问;Private 文件需要认证和 RLS policies。
- 对每个 bucket 记录名称、`public`、`file_size_limit`、`allowed_mime_types`、预计文件数、风险等级和备注。
- 对公开 bucket,构造并记录公开 URL 模式:`https://[project].supabase.co/storage/v1/object/public/[bucket]/[path]`。
- 使用 `/storage/v1/object/list/[bucket]` 列出指定 bucket 内文件;curl 示例:`curl -s "$SUPABASE_URL/storage/v1/object/list/backups" -H "apikey: $ANON_KEY" -H "Authorization: Bearer $ANON_KEY"`。
- 将每个 bucket 的文件列表保存到 `.sb-pentest-evidence/04-storage-audit/buckets/[name]/file-list.json`。
- 将所有 bucket 配置保存到 `.sb-pentest-evidence/04-storage-audit/buckets-config.json`。
- 在 evidence JSON 中记录 `evidence_id`、`timestamp`、`category: storage-audit`、`type: bucket_enumeration`、请求 `method`、`url`、`curl_command`、`buckets` 和 `summary`。
- 将 storage bucket 枚举 curl 命令追加到 `curl-commands.sh`,包括列出所有 buckets 和列出指定 bucket 文件的命令。
- 分析 bucket 配置:`public: false` 通常是私有 bucket,是较安全的默认值;敏感数据出现 `public: true` 是坏配置。
- 分析 `fileSizeLimit`:合适限制是好的;无限制或非常大是不好的配置。
- 分析 `allowedMimeTypes`:受限列表是好的;`*/*` 允许任意类型是不好的配置。
- 识别公开且 MIME 不受限的 bucket,例如 `uploads` 配置为 `*/* (ANY)`,标记为 P1,并建议限制 allowed MIME types。
- 识别公开的敏感 bucket,例如 `backups`,标记为 P0,并立即改为 private bucket。
- 对公开但预期公开的 bucket(如 `avatars`)记录为 info,并确认其风险和访问模式。
- 对私有 bucket(如 `documents`、`temp`)标记为需要后续 RLS 验证。
- 生成 bucket inventory 输出:逐个列出 bucket、Public 状态、File Size Limit、Allowed MIME、Files (estimated)、Status 和公开 URL pattern。
- 生成 summary:Total Buckets、Public Buckets、Expected Public、P1 Issues、P0 Critical、Private Buckets、Next Steps。
- 在 Next Steps 中列出整改项:修复 `backups` bucket 为 private;限制 `uploads` bucket 的 MIME types;测试私有 bucket 的 RLS;验证公开 bucket 中没有敏感文件。
- 将结果写入 `.sb-pentest-context.json` 的 `storage.buckets` 数组,字段包括 `name`、`public`、`file_size_limit`、`allowed_mime_types`、`estimated_files`、`risk_level`、`expected_public`、`finding` 等。
- 将汇总写入 `.sb-pentest-context.json` 的 `storage.summary`,字段包括 `total`、`public`、`private`、`p0_issues`、`p1_issues`。
- 为公开 bucket 创建限制性 RLS 策略,例如:`CREATE POLICY "Public read avatars" ON storage.objects FOR SELECT USING (bucket_id = 'avatars');`。
- 为公开 bucket 的上传创建仅允许用户上传自己文件的策略,例如:`CREATE POLICY "Users upload own avatar" ON storage.objects FOR INSERT WITH CHECK (bucket_id = 'avatars' AND auth.uid()::text = (storage.foldername(name))[1]);`。
- 为私有 bucket 创建仅所有者可访问文件的策略,例如:`CREATE POLICY "Users access own documents" ON storage.objects FOR ALL USING (bucket_id = 'documents' AND auth.uid()::text = (storage.foldername(name))[1]);`。
- 修复公开 backup bucket:执行 `UPDATE storage.buckets SET public = false WHERE name = 'backups';`。
- 为 backup bucket 添加严格 RLS,例如:`CREATE POLICY "Only admins access backups" ON storage.objects FOR ALL USING (bucket_id = 'backups' AND (SELECT is_admin FROM profiles WHERE id = auth.uid()));`。
- 如果无法列出 buckets,记录为 "unable to enumerate";Storage API 可能被限制,这本身可能是好的安全配置。
- 如果发现很多 buckets,优先关注 public buckets。
- 如果 bucket 数量与预期不符,检查应用代码,因为部分 bucket 可能由应用动态创建。
- 证据目录固定为 `.sb-pentest-evidence/04-storage-audit/`。
- 进度要求:边执行边保存;如果技能被中断、崩溃或超时,已发现内容必须已保存。
- 后续可使用 `supabase-audit-buckets-read` 尝试读取文件。
- 后续可使用 `supabase-audit-buckets-public` 查找错误配置的公开 bucket。
- 后续可使用 `supabase-audit-storage-rls` 测试 storage RLS policies。
适用边界 · 注意事项
- 不适用于非 Supabase Storage 项目。
- 不适用于没有目标 Supabase URL、anon key 或未获授权的项目。
- 如果 Storage API 被限制而无法列出 buckets,则不能完成枚举,只能记录为 unable to enumerate。