name: supabase-evidence description: 为专业安全审计初始化和管理证据收集目录,提供发现的文档化证明。
证据收集管理
🔴 关键:需要渐进式文件更新
您必须边进行边编写证据文件,而不是仅在结束时。
- 收集后立即保存每一条证据
- 不要等到技能完成才保存证据
- 如果审计崩溃或被中断,所有先前的证据必须已经保存
这不是可选的。未能渐进式保存证据是一个关键错误。
此技能初始化和管理专业安全审计的证据收集系统。
何时使用此技能
- 在
supabase-pentest开始时自动调用 - 当您需要为专业报告组织证据时
- 当进行需要文档化证明的审计时
- 用于合规和法律目的
为什么证据收集重要
专业安全审计需要:
| 要求 | 目的 |
|---|---|
| 可重复性 | 其他人可以验证发现 |
| 法律证明 | 法律/合规的文档化 |
| 修复验证 | 证明问题在修复前存在 |
| 审计跟踪 | 完整记录所测试的内容 |
证据目录结构
此技能创建 .sb-pentest-evidence/ 目录,结构如下:
.sb-pentest-evidence/
├── README.md # 证据索引和摘要
├── curl-commands.sh # 所有使用的 curl 命令(可重复)
├── timeline.md # 按时间顺序的证据时间线
│
├── 01-detection/
│ ├── initial-scan.json # 原始检测结果
│ ├── supabase-endpoints.txt # 发现的端点
│ └── client-code-snippets/ # 相关代码片段
│ └── supabase-init.js
│
├── 02-extraction/
│ ├── extracted-url.json # URL 提取证明
│ ├── extracted-anon-key.json # 匿名密钥与解码的 JWT
│ ├── extracted-jwts.json # 所有发现的 JWT
│ ├── service-key-exposure/ # 如果发现服务密钥(P0)
│ │ ├── location.txt
│ │ └── decoded-payload.json
│ └── db-string-exposure/ # 如果发现数据库字符串(P0)
│ └── connection-details.json
│
├── 03-api-audit/
│ ├── openapi-schema.json # 原始 OpenAPI/PostgREST 模式
│ ├── tables/
│ │ ├── tables-list.json # 所有暴露的表
│ │ └── tables-metadata.json # 每表的列详情
│ ├── data-samples/ # 检索的数据样本(已编辑)
│ │ ├── users-sample.json
│ │ ├── orders-sample.json
│ │ └── ...
│ ├── rls-tests/ # RLS 策略测试结果
│ │ ├── users-anon.json # 匿名访问尝试
│ │ ├── users-auth.json # 认证访问
│ │ └── cross-user-test.json # 跨用户访问尝试
│ └── rpc-tests/ # RPC 函数测试结果
│ ├── function-list.json
│ └── vulnerable-functions/
│ └── get-all-users.json
│
├── 04-storage-audit/
│ ├── buckets-config.json # 存储桶配置
│ ├── buckets/
│ │ ├── avatars/
│ │ │ └── file-list.json
│ │ ├── backups/ # 如果敏感(P0)
│ │ │ ├── file-list.json
│ │ │ └── sample-contents/ # 已编辑的样本内容
│ │ └── ...
│ └── public-url-tests/ # 直接 URL 访问测试
│ └── backup-access.json
│
├── 05-auth-audit/
│ ├── auth-settings.json # 认证配置
│ ├── signup-tests/
│ │ ├── open-signup.json # 注册可用性
│ │ ├── weak-password.json # 弱密码测试
│ │ └── rate-limit.json # 速率限制测试
│ └── enumeration-tests/
│ ├── login-timing.json # 定时攻击数据
│ ├── recovery-timing.json
│ └── otp-enumeration.json
│
├── 06-realtime-audit/
│ ├── websocket-connection.json
│ ├── postgres-changes/ # 表订阅测试
│ │ └── users-streaming.json
│ ├── broadcast-channels/ # 频道访问测试
│ │ └── admin-channel.json
│ └── presence-data/
│ └── exposed-users.json
│
├── 07-functions-audit/
│ ├── discovered-functions.json
│ └── function-tests/
│ ├── hello-world.json
│ ├── get-user-data-idor.json
│ └── admin-panel-escalation.json
│
└── screenshots/ # 可选:浏览器截图
└── ...
使用方式
初始化证据目录
初始化审计的证据收集
手动证据保存
保存证据:[描述] 到 [类别]
证据文件格式
每个证据文件遵循此结构:
{
"evidence_id": "API-001",
"timestamp": "2025-01-31T10:30:00Z",
"category": "api-audit",
"type": "data-sample",
"finding_id": "P0-001",
"description": "用户表数据无需认证即可访问",
"request": {
"method": "GET",
"url": "https://abc123.supabase.co/rest/v1/users?select=*&limit=5",
"headers": {
"apikey": "[REDACTED - 匿名密钥]",
"Authorization": "Bearer [REDACTED - 匿名密钥]"
},
"curl_command": "curl -X GET 'https://abc123.supabase.co/rest/v1/users?select=*&limit=5' -H 'apikey: eyJ...' -H 'Authorization: Bearer eyJ...'"
},
"response": {
"status": 200,
"headers": {
"content-type": "application/json",
"x-total-count": "1247"
},
"body": [
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"email": "[REDACTED]@example.com",
"name": "[REDACTED]",
"created_at": "2025-01-15T10:30:00Z"
}
],
"body_redacted": true,
"total_rows_indicated": 1247
},
"analysis": {
"severity": "P0",
"impact": "所有用户 PII 无需认证即可访问",
"affected_data": ["email", "name", "id"],
"row_count": 1247
}
}
Curl 命令文件
所有 curl 命令收集在 curl-commands.sh 中:
#!/bin/bash
# Supabase 安全审计 - 可重复命令
# 目标:https://myapp.example.com
# 项目:abc123def.supabase.co
# 日期:2025-01-31
#
# 重要:在运行前替换 [ANON_KEY] 为实际密钥
# 警告:这些命令可能修改数据 - 谨慎使用
SUPABASE_URL="https://abc123def.supabase.co"
ANON_KEY="eyJ..."
# === 检测 ===
# 检查是否使用 Supabase
curl -s "$SUPABASE_URL/rest/v1/" -H "apikey: $ANON_KEY" | head -100
# === 表列表 ===
# 获取 OpenAPI 模式(列出所有表)
curl -s "$SUPABASE_URL/rest/v1/" -H "apikey: $ANON_KEY"
# === 数据访问测试 ===
# 测试:用户表(P0 - 应该被阻止)
curl -s "$SUPABASE_URL/rest/v1/users?select=*&limit=5" \
-H "apikey: $ANON_KEY" \
-H "Authorization: Bearer $ANON_KEY"
# 测试:订单表(应该被 RLS 阻止)
curl -s "$SUPABASE_URL/rest/v1/orders?select=*&limit=5" \
-H "apikey: $ANON_KEY" \
-H "Authorization: Bearer $ANON_KEY"
# === RLS 绕过测试 ===
# ... 额外命令 ...
时间线文件
timeline.md 提供按时间顺序的证据:
# 审计时间线
## 2025-01-31 10:00:00 - 审计开始
- 目标:https://myapp.example.com
- 授权确认
## 2025-01-31 10:05:00 - 检测阶段
- 以高置信度检测到 Supabase
- 项目 URL:https://abc123def.supabase.co
- 证据:`01-detection/initial-scan.json`
## 2025-01-31 10:10:00 - P0 关键:服务密钥暴露
- 在客户端代码中发现服务角色密钥
- 位置:/static/js/admin.chunk.js:89
- 证据:`02-extraction/service-key-exposure/`
## 2025-01-31 10:15:00 - API 审计开始
- 发现 8 个表
- 证据:`03-api-audit/tables/tables-list.json`
## 2025-01-31 10:20:00 - P0 关键:用户表暴露
- 所有 1,247 条用户记录可访问
- PII 暴露:邮箱、姓名
- 证据:`03-api-audit/data-samples/users-sample.json`
...
上下文输出
更新 .sb-pentest-context.json:
{
"evidence": {
"directory": ".sb-pentest-evidence",
"initialized_at": "2025-01-31T10:00:00Z",
"files_count": 45,
"categories": {
"detection": 3,
"extraction": 5,
"api-audit": 15,
"storage-audit": 8,
"auth-audit": 7,
"realtime-audit": 4,
"functions-audit": 3
},
"critical_evidence": [
"02-extraction/service-key-exposure/",
"03-api-audit/data-samples/users-sample.json",
"04-storage-audit/buckets/backups/"
]
}
}
证据收集规则
收集什么
| 类别 | 证据类型 | 示例 |
|---|---|---|
| 始终 | 原始 API 响应 | JSON 响应 |
| 始终 | Curl 命令 | 可重复命令 |
| 始终 | 时间戳 | 每次测试发生的时间 |
| P0/P1 | 数据样本(已编辑) | 样本行,PII 已掩码 |
| P0 | 完整请求/响应 | 完整的 HTTP 交换 |
| 可选 | 截图 | 浏览器证据 |
编辑规则
敏感数据必须在证据文件中编辑:
{
"original": "john.doe@example.com",
"redacted": "[REDACTED]@example.com"
}
{
"original": "John Doe",
"redacted": "[REDACTED]"
}
{
"original": "sk_live_xxxxxxxxxxxxxxxxxxxx",
"redacted": "sk_live_[REDACTED]"
}
绝不存储在证据中:
- 实际密码
- 完整信用卡号
- 完整 API 密钥(仅显示前/后 4 个字符)
- 完整个人数据(需要部分编辑)
命名约定
[类别]-[测试名称]-[时间戳].json
示例:
users-anon-access-20250131-103000.jsonadmin-function-no-auth-20250131-143000.json
强制:证据文件更新
⚠️ 证据必须在执行过程中渐进式保存。
关键规则:边进行边保存
不要在结束时批量所有证据。而是:
- 在每次测试前 → 创建证据文件占位符
- 在每次请求后 → 立即保存请求详情
- 在每次响应后 → 立即保存响应
- 在分析后 → 将分析添加到证据文件
目录初始化
在审计开始时,创建:
mkdir -p .sb-pentest-evidence/{01-detection,02-extraction,03-api-audit/tables,03-api-audit/data-samples,03-api-audit/rls-tests,03-api-audit/rpc-tests,04-storage-audit/buckets,04-storage-audit/public-url-tests,05-auth-audit/signup-tests,05-auth-audit/enumeration-tests,06-realtime-audit/postgres-changes,06-realtime-audit/broadcast-channels,07-functions-audit/function-tests,screenshots}
记录到审计日志
[时间戳] [supabase-evidence] [开始] 初始化证据目录
[时间戳] [supabase-evidence] [创建] .sb-pentest-evidence/
[时间戳] [supabase-evidence] [上下文更新] 证据跟踪初始化
与其他技能的集成
此技能由 supabase-pentest 自动调用。每个审计技能应该:
- 将证据保存到适当的子目录
- 使用一致的命名约定
- 添加条目到
curl-commands.sh - 为重要发现更新
timeline.md
相关技能
supabase-pentest— 初始化证据收集的协调器supabase-report— 使用证据进行综合报告- 所有审计技能 — 向各自目录贡献证据