关于 supabase-extract-url
此安全技能从 Web 应用的客户端代码或本地文件中提取 Supabase 项目 URL。它会识别并验证 URL,并保存发现结果和证据,以供后续 Supabase 审计使用。
主要功能
- 01扫描 JavaScript、HTML 和配置
- 02识别标准域名与自定义域名
- 03验证 URL 格式及 API 响应
- 04识别多个 Supabase 项目 URL
- 05保存发现结果与提取证据
适用场景
- 01确认应用使用的 Supabase 项目
- 02查找后续测试所需的 API 基础 URL
- 03从下载的应用文件中提取 URL
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ yoanbernabeu/ supabase-pentest-skills --skill supabase-extract-url安装后在 Claude Code 中输入/supabase-extract-url确认已加载。
详细介绍
Supabase URL 提取
🔴 关键:必须渐进式更新文件
必须随发现随写入上下文文件,而不是只在最后写入。
- 每次发现后立即写入
.sb-pentest-context.json- 每项操作前后都记录到
.sb-pentest-audit.log- 不要等到技能执行完毕后才更新文件
- 如果技能崩溃或中断,之前的所有发现都必须已保存
这不是可选项。未能渐进式写入属于严重错误。
此技能从 Web 应用的客户端代码中提取 Supabase 项目 URL。
何时使用此技能
- 检测到 Supabase 使用情况后,获取确切的项目 URL
- 需要 API 基础 URL 以进行后续测试时
- 确认应用使用的是哪个 Supabase 项目
前提条件
- 目标 URL 可访问
- 已检测到(或怀疑存在)Supabase 使用情况
工作原理
此技能会扫描以下位置中的 URL 模式:
1. JavaScript 源代码
// Direct URL references
const SUPABASE_URL = 'https://abc123.supabase.co'
createClient('https://abc123.supabase.co', key)
// Environment variable patterns
process.env.SUPABASE_URL
process.env.NEXT_PUBLIC_SUPABASE_URL
import.meta.env.VITE_SUPABASE_URL
2. HTML Meta 标签和脚本
<meta name="supabase-url" content="https://abc123.supabase.co">
<script>
window.SUPABASE_URL = 'https://abc123.supabase.co'
</script>
3. 配置对象
const config = {
supabase: {
url: 'https://abc123.supabase.co'
}
}
URL 模式匹配
可识别的模式:
| 模式 | 示例 |
|---|---|
| 标准 | https://abc123.supabase.co |
| 带区域 | https://abc123.eu-central-1.supabase.co |
| 自定义域名 | 通过 API 端点模式检测 |
使用方法
基本提取
Extract Supabase URL from https://myapp.example.com
从本地文件提取
如果你已下载源代码:
Extract Supabase URL from ./dist/assets/
输出格式
═══════════════════════════════════════════════════════════
SUPABASE URL EXTRACTED
═══════════════════════════════════════════════════════════
Project URL: https://abc123def.supabase.co
Project Ref: abc123def
Region: us-east-1 (inferred)
Found in:
├── /static/js/main.abc123.js (line 1247)
│ └── const SUPABASE_URL = 'https://abc123def.supabase.co'
│
└── /static/js/chunk.def456.js (line 89)
└── createClient('https://abc123def.supabase.co', ...)
API Endpoints:
├── REST API: https://abc123def.supabase.co/rest/v1/
├── Auth API: https://abc123def.supabase.co/auth/v1/
├── Storage: https://abc123def.supabase.co/storage/v1/
└── Realtime: wss://abc123def.supabase.co/realtime/v1/
Context updated: .sb-pentest-context.json
═══════════════════════════════════════════════════════════
上下文输出
保存到 .sb-pentest-context.json:
{
"supabase": {
"project_url": "https://abc123def.supabase.co",
"project_ref": "abc123def",
"region": "us-east-1",
"endpoints": {
"rest": "https://abc123def.supabase.co/rest/v1/",
"auth": "https://abc123def.supabase.co/auth/v1/",
"storage": "https://abc123def.supabase.co/storage/v1/",
"realtime": "wss://abc123def.supabase.co/realtime/v1/",
"functions": "https://abc123def.supabase.co/functions/v1/"
},
"sources": [
{
"file": "/static/js/main.abc123.js",
"line": 1247,
"context": "const SUPABASE_URL = 'https://abc123def.supabase.co'"
}
]
}
}
多个 URL
如果找到多个 Supabase URL:
═══════════════════════════════════════════════════════════
MULTIPLE SUPABASE URLS FOUND
═══════════════════════════════════════════════════════════
⚠️ Multiple Supabase projects detected
1. https://abc123.supabase.co (primary - most references)
└── Found in: main.js, config.js
2. https://xyz789.supabase.co (secondary)
└── Found in: analytics.js
Using primary URL for further analysis.
To use a different URL, specify it manually.
═══════════════════════════════════════════════════════════
验证
此技能通过以下方式验证提取的 URL:
- 格式检查 — 是否符合预期的 Supabase URL 模式
- 可达性检查 — 尝试访问 REST API 端点
- 响应验证 — 确认响应类似 Supabase
Validation:
├── Format: ✅ Valid Supabase URL format
├── Reachable: ✅ REST API responds (200 OK)
└── Confirmed: ✅ Response matches Supabase pattern
常见问题
❌ **问题:**检测到 Supabase,但未找到 URL
✅ **解决方案:**URL 可能位于动态加载的代码块中。请尝试:
Extract URL with deep scan from https://myapp.example.com
❌ **问题:**找到 URL,但验证失败
✅ **解决方案:**项目可能已暂停,或区域可能存在连接问题。该 URL 仍会被记录。
❌ **问题:**只找到自定义域名
✅ **解决方案:**自定义域名有效。此技能会将其标记为自定义域名,并尝试识别底层项目。
安全说明
- 此技能只读取公开可用的代码
- 不会尝试进行身份验证
- 仅凭 URL 无法获得访问权限(还需要密钥)
后续步骤
提取 URL 后:
- 运行
supabase-extract-anon-key查找 API 密钥 - 运行
supabase-extract-service-key检查是否泄露了服务密钥 - 继续使用 API 审计技能
强制要求:渐进式更新上下文文件
⚠️ 此技能在执行过程中必须渐进式更新跟踪文件,而不能只在最后更新。
关键规则:随做随写
不要在最后批量写入。应按以下步骤操作:
- 开始任何操作前 → 将该操作记录到
.sb-pentest-audit.log - 每次发现后 → 立即更新
.sb-pentest-context.json - 每个重要步骤后 → 将完成情况记录到
.sb-pentest-audit.log
这样可以确保即使技能中断、崩溃或超时,迄今为止的所有发现也都能保留。
必须执行的操作(渐进式)
-
更新
.sb-pentest-context.json,写入提取的数据:{ "supabase": { "project_url": "https://[ref].supabase.co", "project_ref": "[ref]", "endpoints": { ... } } } -
记录到
.sb-pentest-audit.log:[TIMESTAMP] [supabase-extract-url] [START] Beginning URL extraction [TIMESTAMP] [supabase-extract-url] [SUCCESS] URL extracted: https://[ref].supabase.co [TIMESTAMP] [supabase-extract-url] [CONTEXT_UPDATED] .sb-pentest-context.json updated -
如果文件不存在,请在写入前创建文件。
不接受未更新上下文文件的情况。
强制要求:证据收集
📁 证据目录:.sb-pentest-evidence/02-extraction/
需要创建的证据文件
| 文件 | 内容 |
|---|---|
extracted-url.json | 包含来源位置的 URL 提取详情 |
证据格式
{
"evidence_id": "EXT-URL-001",
"timestamp": "2025-01-31T10:05:00Z",
"category": "extraction",
"type": "url_extraction",
"extracted_data": {
"project_url": "https://abc123def.supabase.co",
"project_ref": "abc123def",
"region": "us-east-1"
},
"sources": [
{
"file": "/static/js/main.js",
"line": 1247,
"context": "const SUPABASE_URL = 'https://abc123def.supabase.co'"
}
],
"endpoints_discovered": {
"rest": "https://abc123def.supabase.co/rest/v1/",
"auth": "https://abc123def.supabase.co/auth/v1/",
"storage": "https://abc123def.supabase.co/storage/v1/",
"realtime": "wss://abc123def.supabase.co/realtime/v1/"
}
}
相关技能
supabase-detect— 首先检测是否使用 Supabasesupabase-extract-anon-key— 提取 anon keysupabase-extract-service-key— 检查 service key 是否泄露