Shikata Ga Nai

Private? There is no such things.

CSRF(クロスサイトリクエストフォージェリ)診断マニュアル

Hello there, ('ω')ノ

🎯 1. CSRFとは?

CSRF(Cross-Site Request Forgery)は、 「ログイン中のユーザに対して、意図しない操作を外部サイトから強制的に実行させる攻撃」です。

被害者が正規の認証状態で悪意のあるリクエストを送ってしまうため、 攻撃者自身はログインしていなくても、重要な操作が実行されてしまうのが特徴です。


💥 2. 例:CSRFが成立する典型ケース

<!-- 攻撃者が設置する悪意のあるページ -->
<img src="https://target-site.com/account/delete?id=1" />

被害者がこのページを開くと、ログイン状態のままリクエストが送られ、アカウントが削除される


🧭 3. チェックすべき対象機能

種類 内容
🔧 設定変更 メールアドレス、パスワード変更など
🗑️ 削除・退会機能 アカウント削除、投稿削除など
💰 金銭操作 ポイント付与、送金など
⚙️ 管理系操作 ユーザ権限変更、設定更新
📝 投稿・コメント機能 意図しない書き込みができるか

🔍 4. CSRF診断の手順

  1. 対象機能のリクエストをBurpで取得
  2. HTMLフォームまたは自動送信スクリプトとして再構築
  3. 別ドメインのページとしてブラウザで開く
  4. 対象サイトでログイン状態のまま開いたときに、リクエストが通るか確認

🧪 5. CSRF診断用テストコード例(POSTの場合)

<!-- csrf_test.html(ローカルファイルでOK) -->
<form action="https://target-site.com/profile/update" method="POST">
  <input type="hidden" name="email" value="attacker@example.com">
  <input type="submit" value="送信">
</form>

<script>
  document.forms[0].submit();
</script>

→ このページを開いた瞬間、自動で送信される


🔐 6. 防御されていない状態のサイン

チェック項目 問題の兆候
CSRFトークンがない hiddenフィールド or ヘッダに _csrf などが存在しない
Referer / Origin チェックなし 他ドメインからのリクエストも成功する
セッションCookieのみで認証している トークン等がなければCSRFが成立しやすい

✅ 7. 防御されているかの確認方法

対策 説明
CSRFトークンの存在 フォームやヘッダに含まれている(例:X-CSRF-Token
トークンの確認 トークンを省いて送信すると403などで拒否される
Referer/Originの検査 他ドメインからのリクエストが拒否される

📄 8. GET リクエストでもCSRFは起こる?

✅ はい、GETでも副作用のある操作(例:アカウント削除など)が存在するなら、脆弱性があります。 基本的には副作用のある操作はPOST/PUT/DELETEで行うべきです。


🧰 9. 補助ツール

  • Burp Suite:リクエスト保存・改変・HTML化に便利
  • Postman:トークンあり/なしで送信比較が可能
  • CSRF PoC Generator(Burp拡張):自動でHTMLを生成

⚠️ 10. 注意点・ベストプラクティス

ポイント 解説
トークンは毎回変える(ワンタイムが理想)
認証CookieはHttpOnlyでもCSRFには無効(JavaScript経由でなくても送られる)
SameSite 属性のCookie設定が有効な防御になる(例:SameSite=Strict
管理者系操作は特に厳重にトークンチェックを行う

📌 診断対象を見つけるヒント

  • action="/update", action="/delete" などのHTMLフォーム
  • POST /api/xxxGET /delete?id=... のようなリクエスト
  • ログイン状態でしか動かない機能で、副作用のある操作

Best regards, (^^ゞ