mcpField
S
supabase-extract-url

supabase-extract-url

github.com/yoanbernabeuセキュリティ71473 回インストール39 週間前に更新
リポジトリ

supabase-extract-url について

Webアプリのクライアント側コードやローカルファイルからSupabaseプロジェクトのURLを抽出するセキュリティスキルです。URLを検出・検証し、後続のSupabase監査に向けて結果と証拠を保存します。

主な機能

  1. 01JavaScript・HTML・設定のスキャン
  2. 02標準ドメインとカスタムドメインの検出
  3. 03URL形式とAPI応答の検証
  4. 04複数のSupabaseプロジェクトURLの特定
  5. 05検出結果と抽出証拠の保存

活用シーン

  1. 01アプリが使用するSupabaseプロジェクトの特定
  2. 02後続テスト用のAPIベースURLの確認
  3. 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 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 を検証します。

  1. 形式の確認 — Supabase URL の想定パターンに一致するか確認します
  2. 到達可能性の確認 — REST API エンドポイントへの到達を試みます
  3. 応答の検証 — 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 を抽出した後:

  1. supabase-extract-anon-key を実行して API キーを見つけます
  2. supabase-extract-service-key を実行して、漏えいしたサービスキーがないか確認します
  3. API 監査スキルに進みます

必須:コンテキストファイルの段階的な更新

⚠️ このスキルは実行中に追跡ファイルを段階的に更新する必要があり、最後にまとめて更新してはいけません。

重要なルール:作業を進めながら書き込む

書き込みを最後にまとめて行わないでください。代わりに:

  1. アクションを開始する前に → アクションを .sb-pentest-audit.log に記録します
  2. 発見するたびに → .sb-pentest-context.json を直ちに更新します
  3. 重要な手順が終わるたびに → 完了を .sb-pentest-audit.log に記録します

これにより、スキルが中断、クラッシュ、またはタイムアウトした場合でも、その時点までの調査結果がすべて保持されます。

必須のアクション(段階的に実行)
  1. 抽出したデータで .sb-pentest-context.json を更新します:

    {
      "supabase": {
        "project_url": "https://[ref].supabase.co",
        "project_ref": "[ref]",
        "endpoints": { ... }
      }
    }
    
  2. .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
    
  3. ファイルが存在しない場合は、書き込む前に作成します。

コンテキストファイルを更新しないことは許容されません。

必須:証拠の収集

📁 証拠ディレクトリ: .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 — まず Supabase の使用を検出します
  • supabase-extract-anon-key — anon キーを抽出します
  • supabase-extract-service-key — service キーの漏えいを確認します

コメント