
【AI文芸 シリーズ玲奈様のセキュリティ診断】セッション管理 編
情報処理安全確保支援士試験の過去問をネタにしていますが、どこまで設問の内容に沿っているかは確認していません。
ターゲット: 転職支援サイト M社
M社は、転職支援Webサイトの新バージョンをリリース直前。
「念のためのチェック」として、B社(玲奈の所属するセキュリティ診断会社)に脆弱性診断を依頼した。
この時点では、M社はまだ自分たちのシステムが崩壊寸前だとは夢にも思っていない。
M社の開発チーム「うちはセキュアです」
会議室に集められたM社の開発チーム。
スーツ姿のプロジェクトマネージャー、開発リーダー、エンジニアたち。
PM:「今回は、リリース前の最終セキュリティチェックということで。
B社さんには、通常の脆弱性診断をお願いしたいと思います」
開発リーダー:「うちのシステム、基本的には問題ないはずなんですけどね。
ログイン処理も、セッション管理もしっかりやってるので」
玲奈:「……しっかり、ね」
開発リーダー:「ええ、ユーザーごとに sessionID を生成して、hidden フィールドで管理してます」
玲奈:「は?」
開発者A:「え?」
玲奈:「それもう終わってるよね?」
開発リーダー:「え、いや、でも……hidden フィールドに入れておけば、フォーム送信時にサーバー側で確認できるので」
玲奈:「まさかとは思うけど、それってログイン後ずっと変わらない?」
開発リーダー:「はい、ログイン後は固定で……」
玲奈:「おいおいおいおいおいおいおいおいおいおいおいおい」
玲奈:「ちょっと待って、嘘でしょ? 本気で言ってる?」
診断開始
玲奈、何も言わずに M社のテスト環境にアクセス。
ブラウザでログイン画面を開き、開発者ツールを開く。
<input type="hidden" id="sessionID" name="sessionID" value="764b2ac2-0452-49e4-92a7-0914fa005011">
玲奈:「……」
開発リーダー:「(何か問題が?)」
玲奈:「笑っていい? いや、笑えないな。これ、本番環境と同じ構成だよね?」
開発リーダー:「そ、そうですが……」
玲奈:「はぁーーーっ……」
玲奈、首をゴキゴキ鳴らす。
攻撃シナリオ
玲奈:「じゃあ、実際に攻撃してみるね?」
ログインページを開く
開発者ツールで HTML の hidden フィールドを見る
sessionID をコピー
ブラウザの別タブで、求人企業の管理画面のURLを直接開く
開発ツールで hidden の sessionID を変更、M社の担当者が使ってる sessionID に書き換える
更新ボタンをクリック
……ログイン完了
玲奈:「はい、乗っ取れました」
開発者A:「えっ、えっ、待って待って待って!? えっ、どうやって!?」
玲奈:「だから言ったでしょ? hidden に sessionID 入れてる時点で終わってるって」
開発リーダー:「ま、待ってください! どういうことですか!?」
説明(という名の玲奈のブチギレタイム)
玲奈:「まず、この sessionID って、hidden に入れるもんじゃないの。
だって、こんなの 誰でも見れる んだよ?」
開発者B:「い、いやでも、ログインしたユーザーだけが見れるはずでは……?」
玲奈:「はい、間違い。
ログインページに入る前の段階で、適当な sessionID をセットできる仕様になってるよね?」
開発リーダー:「あ……」
玲奈:「さらに、sessionID を ずっと固定 してるってことは、
攻撃者が一度それを知っちゃえば、ずっとログインできるんだよ。
これ、セッション管理じゃなくて 穴 だからね?」
開発リーダー:「……」
玲奈:「おまけに、ログアウトしても sessionID が変わらない。
攻撃者が取得した sessionID は、何回でも使いまわせる。
……つまり、ユーザーがログアウトしても、攻撃者はずっとアクセスできる わけ」
開発者A:「う、嘘……」
玲奈:「はい、詰み。
これ、M社の求人企業のアカウントを全部乗っ取れるってことね?」
修正方法
玲奈:「いい? 修正しないと、マジでヤバいから」
✅ セッションIDを hidden に入れるのをやめる
✅ ログイン成功時に必ず新しい sessionID を発行する
✅ sessionID は HttpOnly & Secure クッキーに保存する
✅ 一定時間経過後にセッションを無効化する
開発リーダー:「……やります」
PM:「すぐ修正を……」
玲奈:「うん、今すぐね。
だって、このままリリースしたら、全求人企業のデータ流出確定 だから」
玲奈の総評
「セッション管理って、ログインの根幹でしょ?
適当にやったら、ユーザーのアカウントが全部乗っ取られるって、分かる?」
「"ログイン処理" ってのは、
"ログインさせること" じゃなくて "ログインしてない奴を弾くこと" が目的なの。
それを考えずに作ると、こういう "ただの飾り" になる」
「今回のは、"セキュリティ" じゃなくて "セキュリティっぽい何か" だから。
いますぐ、やり直し」
次回予告
次回、
Episode 2: メールの中身、こっちで決めとくね?(メールヘッダーインジェクション)
「To: も CC: も、こっちで決めさせてもらうわ」
M社の開発チーム、さらなる地獄へ突入――。