Shikata Ga Nai

Private? There is no such things.

CORS(クロスオリジンリソース共有)診断マニュアル

Hello there, ('ω')ノ

🎯 1. CORSとは?

CORS(Cross-Origin Resource Sharing)は、あるWebサイト(オリジン)から別のオリジンのリソースへアクセスすることを、 ブラウザが制御するための仕組みです。

例: https://evil.com から https://secure.example.com/api/user にアクセスしようとする → ブラウザがCORSポリシーで許可・拒否を判定


💥 CORSが脆弱な場合のリスク

攻撃内容 説明
🔓 任意オリジンからの読み出し 攻撃者サイトから機密APIを読み取れる
🔑 認証付きリクエストが成功 ユーザがログイン中であればCookie付きで送信されてしまう
🧨 結果 → 他サイトから情報が盗める(例:個人情報、購入履歴など)

🧭 2. CORSの仕組み(簡単解説)

重要なヘッダ:

ヘッダ名 意味
Access-Control-Allow-Origin 外部サイトからのアクセスを許可するドメイン
Access-Control-Allow-Credentials Cookie付きのリクエストを許可するか
Origin リクエスト元のオリジン(ブラウザが自動で送る)

🧪 3. 基本的な診断ポイント

🔎 診断対象:

  • APIエンドポイント(例:/api/user/info, /auth/check など)
  • 特にログイン中のユーザ情報が取得できるもの
  • 管理者しか見られない内容が含まれるレスポンス

🛠️ 4. CORSの誤設定パターンと危険性

誤設定 説明 危険度
Access-Control-Allow-Origin: * + Allow-Credentials: true 仕様違反 + 高リスク 🚨 危険!
Access-Control-Allow-Origin: Originヘッダをそのまま返す 任意オリジンにアクセス許可 🚨 高危険
Access-Control-Allow-Origin: * Cookieなしでも全体公開 ⚠️ 中リスク
重要APIにCORS許可あり 認証情報が盗まれる可能性 🚨 危険

📄 5. テスト手順(手動)

① 任意のオリジンから API を呼ぶ JavaScript を用意

<!-- cors_test.html(攻撃用) -->
<script>
fetch("https://target-site.com/api/user", {
  credentials: "include"
})
.then(r => r.text())
.then(data => alert(data));
</script>

このHTMLを https://attacker.com 上に設置し、被害者がログイン中に開いたとき、 データが読み取れたら CORS脆弱性成立


② curl でレスポンスヘッダを確認:

curl -i -H "Origin: https://evil.com" https://target-site.com/api/user

観察ポイント:

  • Access-Control-Allow-Origin: https://evil.com ← そのまま反映されていたら危険
  • Access-Control-Allow-Credentials: true が付いていたら Cookie も送信可 → 高危険

✅ 6. 診断成功のサイン

状況 結果
任意オリジンに対し Access-Control-Allow-Origin が付く ❌ 不適切な許可設定
Cookie付きでレスポンスが得られる ❌ 認証情報が盗まれる危険あり
認証中の情報(ユーザ名・注文履歴など)が表示される ❌ 完全に脆弱な状態

🔐 7. 安全なCORS設定例

ヘッダ 安全な内容
Access-Control-Allow-Origin 信頼できる特定ドメインのみ
Access-Control-Allow-Credentials true にする場合は Origin を * にしない
Vary: Origin キャッシュ誤用を防ぐために必要

🧰 8. 補助ツール

  • Burp SuiteOrigin ヘッダを変えて再送信しやすい
  • curl / Postman:手動でCORSヘッダ確認
  • CORS Scanner(Burp拡張)
  • test-cors.org:ブラウザで簡易確認できるCORSテストサービス

📌 9. よくあるミス設定の例と対策

誤設定 対策
Access-Control-Allow-Origin: * パブリックAPI以外では使用禁止
リクエスト元のOriginをそのまま反映 サーバ側で信頼できるオリジンかチェック必須
認証が必要なAPIにCORS許可 認証情報が他サイトに漏れるリスク大

🎯 10. 見つけやすいキーワード・チェック場所

  • Origin: https://evil.com → レスポンスに Access-Control-Allow-Origin が付くか?
  • APIの /user, /profile, /auth, /order など
  • credentials: include で Cookie が送られても応答があるか?

Best regards, (^^ゞ