【CORS・SOP編】ブラウザの境界線を突破する手口と守り方|CTF思考フレームワーク #10
📖 この記事はシリーズの一部です
「CTF思考フレームワーク」 認証・セッション編 #10 / 公開中 10記事 → シリーズ一覧を見る →
CORS(Cross-Origin Resource Sharing)とSOP(Same-Origin Policy)は、ブラウザのセキュリティ境界の根幹。設定を1つ間違えると「他のサイトから自分のサイトのデータが読まれる」ということが起きます。今回はその境界線がどう崩れるかを見ていきましょう🚧
SOPの基本を押さえつつ、CORS設定ミス・クリックジャッキング・CSPの3点を整理していきます。
このシリーズは「攻撃者の思考をなぞる」ことが目的。手を動かさなくても読み物として理解できるレベルです👍

CORSは「設定の油断」がそのまま脆弱性になる場所。地味だけど重要だよ🚧
難易度:★★☆(やさしめ) / 所要:8〜10分 / 前提:CTF思考フレームワーク #09
👀 観察フェーズ:まず何を見る?

まずOPTIONSプリフライトとAccess-Control-*系のレスポンスヘッダをじっくり観察!
Allow-Origin に Origin ヘッダをそのまま返す「動的エコー」+ Allow-Credentials: true は、教科書的な脆弱パターン。要注意です。

Originをそのまま返してくる実装って、どんなサイトからでもアクセスOKって言ってるのと同じだよね…😱
🤔 仮説フェーズ:攻撃者は何を考える?

ブラウザ境界の崩し方は4つのパターンに分けられるよ。
ここから攻撃者の仮説を見ていきましょう。
🪞 仮説①:Originエコー+Credentials許可
Access-Control-Allow-Originがリクエスト元のOriginをそのまま反射し、かつAllow-Credentials: trueだと、他サイトからCookie付きでAPI叩き放題。
🌐 仮説②:null Origin許可
Origin: nullを許可している実装は危険。サンドボックス化されたiframeやfile://から攻撃可能。
🖼️ 仮説③:X-Frame-Options欠落=クリックジャッキング
X-Frame-Optionsもframe-ancestors(CSP)も無いと、透明iframeを被せて誤クリックを誘導するクリックジャッキングが成立。
🧨 仮説④:CSPのunsafe-inline
CSPにunsafe-inlineやunsafe-evalがあると、XSSの本来のブレーキが利かない。せっかくのCSPが台無しに。
「ブラウザが守ってくれる」と思いきや、設定次第で簡単に突破されてしまいます。CORSは「許可するときの作法」が大事です。

CORSもCSPも「設定したつもり」が一番危ないってことだね💧
🔬 検証フェーズ:どうやって確かめる?

検証は悪意あるOriginからfetchを投げて、レスポンスが返るかを見るのが手っ取り早いよ。
検証の流れ。

別ドメインのHTMLを立ててfetchして…レスポンスが読めたらアウトってことだね🧪
⚔️ 攻撃フェーズ:実際の手口

代表的な攻撃はこの3つ。
ここからは実戦シナリオを見ていきます。
悪意サイトから被害者のCookie付きでAPIを叩いてレスポンスを読み取る。CORS設定ミス1つで個人情報が抜ける。
透明iframeで本物サイトを覆い、「ボタンを押させた」ことにして送金や削除を実行させる。
XSSが見つかった場合、CSPにunsafe-inlineがあればそのまま実行可能。CSPを設定していても無意味化されてしまいます。
CTF{cors_origin_must_be_explicit_allowlist}
CORSは「正しく開ける」のが大事。SOPは強力な防壁ですが、設定で穴を空けるのも開発者です。
🛡️ 防御フェーズ:どう守る?

ブラウザ境界を守る3点セットはこれ!🛡️
ブラウザ境界を正しく引く設計のポイントを見ていきます。
Access-Control-Allow-Originは許可ドメインを明示的に列挙。ワイルドカード(*)とCredentialsの併用は禁止。
X-Frame-Options: DENYまたはframe-ancestors 'self'でiframe埋め込みを禁止。クリックジャッキング根絶。
インラインスクリプトを許すなら必ずnonceかhashベースに。unsafe-inlineは本番ではゼロを目指す。

ブラウザに任せきりじゃなくて、サーバ側のヘッダで明確に境界を引くのが大事なんだね💡
🛡️ 今日からできる対策ツール
パスワードの使い回しや手動管理はどんなに気をつけても限界があります。🔑 パスワード管理ツール「ワンパス」なら、複雑なパスワードを安全に保管して「1つのマスターパスワード」だけ覚えられるので、今日から始める防御策としてしっくりきます。
※ 上記は他社サービスへのリンクです。購入は各自でご判断ください。
⚠️ よくある落とし穴
現場でよく見かけるミスはこんな感じです。
- CORSで Allow-Origin: * と Allow-Credentials: true を併用しようとする(ブラウザがブロックするので機能しない=設定意図のすれ違い)。
- Origin ヘッダの値をそのままエコーして「動的に許可」する。
- X-Frame-Options を忘れて、ログイン画面ごと iframe で奪われる。
- CSPに unsafe-inline を残し、XSS発生時の防御層を失う。
- サブドメインを Allow-Origin に含めて、サブドメインのXSSが本体まで波及。
- 開発環境のCORS緩設定を本番にそのまま反映してしまう。
🧰 ツール早見表
ここで使うツールを早見表にまとめました。
| ツール | 用途 | ひと言 |
|---|---|---|
| CSP Evaluator (Google) | CSPヘッダ評価 | 貼るだけで脆弱箇所を指摘 |
| SecurityHeaders.com | セキュリティヘッダ採点 | 総合チェックの第一歩 |
| Burp Suite | CORS / preflight検証 | Origin改ざんも一発 |
| CORS Misconfiguration Scanner | 自動検査 | CORtest など専用ツール |
🎓 本気で学びたい人へ
Webセキュリティを「趣味」から「仕事」に変えたい方へ。🎓 ササエルはインフラエンジニアに特化したオンラインスクールで、セキュリティ設計の基礎から体系的に学べます。
📚 もっと深く学びたい人へ
体系的に攻撃と防御の両面を学びたいなら『ホワイトハッカー入門 第2版』が分かりやすい入口です📚
⚖️ 大事なお約束
この記事の手法は、必ず自分の環境か、許可されたCTF・脆弱性報奨金プログラム(HackerOne、Bugcrowd等)で試してください。他人のサービスに無断で攻撃を仕掛けるのは不正アクセス禁止法違反、立派な犯罪です。学んだ知識は守る側で活かしましょう🤝
📚 次に読みたい
- セッション・Cookie編|CTF思考フレームワーク #08
- API・GraphQL編|CTF思考フレームワーク #09
- 検索フォーム編(XSS)|CTF思考フレームワーク #04
- お問い合わせフォーム編(CSRF)|CTF思考フレームワーク #05
🧪 自分で検証してみる
「自分でWordPressサイトを立てて、ログイン畫面のセキュリティを実際に試してみたい」なら、まずは安価で高速なConoHa WINGから。初期費用無料で始められます。



