Hello there, ('ω')ノ
CSRFが成立する条件
- 対象サイトにログイン済みであること
- 特定の操作が「確認なし」で実行できること
- セキュリティトークンなどがついていないこと
実際のチェック手順① 対象となる操作を洗い出す
CSRFリスクがあるのは「データ更新系」の操作です。
✅ 例:
- パスワード変更
- メールアドレス変更
- 経費申請の承認
- ユーザー削除
画面上でボタンやフォーム送信が必要な操作をリストアップします。
実際のチェック手順② リクエスト内容を確認する
① ブラウザ開発者ツール → Networkタブ
② 対象操作を実行 → その時のリクエストを確認
✅ 観察ポイント:
- POSTリクエストか?(GETでも注意)
- CSRFトークンらしきパラメーターが含まれているか? 例:csrf_token、_token、authenticity_token
含まれていない場合 → 要注意です。
実際のチェック手順③ 簡単なテストHTMLを作成して試す
以下のようなHTMLをローカルで作成します:
<form action="https://intra.example.co.jp/user/delete" method="POST"> <input type="hidden" name="user_id" value="123"> <input type="submit" value="送信"> </form>
このHTMLを開いてボタンを押すだけで操作が成立してしまう場合 → CSRF脆弱性ありです。
CSRF対策がされている場合の特徴
- フォーム内にランダムなトークンが含まれている
- RefererやOriginヘッダーでチェックされている
ブラウザ開発者ツール → Headersタブ → Request Headers で確認できます。
社内システムでのよくある盲点
- 経費申請や承認機能
- 勤怠打刻操作
- 管理者権限によるユーザー管理画面
「確認画面なし」「ワンクリックで確定」タイプの操作は特に注意が必要です。
チェックリストまとめ
- [ ] 操作対象ページにCSRFトークンが含まれているか?
- [ ] POSTリクエスト時にRefererやOriginヘッダーが使われているか?
- [ ] テスト用HTMLフォームを使って操作再現ができるか?
- [ ] 本番環境で試す場合は必ず許可を取っているか?
注意事項
- 本番環境でのテストは慎重に!
- テストは自己責任で、安全な環境で行うこと
Best regards, (^^ゞ