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 を用意
<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 Suite:
Origin
ヘッダを変えて再送信しやすい
- 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, (^^ゞ