コース目次 / 第3章
クライアント任せの権限 — 隠すは守りにならない
ブラウザの中にある「管理者フラグ」を書き換えて、隠れていた管理者メニューを出します。クライアントを信じる設計の破綻を見ます。
この章は攻撃者の操作をボタン1つで再現します(自作環境専用)。下の枠は完全に架空のサービスで、書き換わるのは枠の中の値だけです。実在のサービスのフラグや画面を勝手に書き換えてはいけません(法と倫理)。
初心者がやりがちな「守り」に、こういうものがあります——「管理者じゃない人には、管理者ボタンを表示しない」。あるいは「ボタンを無効化(グレーアウト)する」。一見、正しそうに見えます。でも、その判定がブラウザの中だけで行われているなら、それは守りになっていません。
法と倫理ゲート
手を動かす前に
このコースは攻撃の技術に触れます。実習してよい相手は、次の3つだけです。
- (a) 自分で作った練習用のやられ環境(このサイトが配る自作ターゲット)
- (b) あなた自身の許可された環境(自分の Thousand SKY・secret-notes-ctf など)
- (c) CTF 競技の中(規約の範囲で)
実在する第三者のシステムを許可なく触ることは、不正アクセス禁止法に触れます。 このゲートは、その線引きを毎回の入口で確かめるためのものです。詳しくは「セキュリティの法と倫理」へ。
同意すると、この先の内容が表示されます。
触ってみる
下は架空のサービスの画面です。いまのあなたの権限は「一般ユーザー」で、管理者メニュー(利用者一覧)は隠れています。判定はクライアント側だけで行われています。
赤いボタンを押してください。これは、攻撃者が開発者ツールのコンソールで session.role = 'admin' と打つのと同じことを、ボタン1つに置き換えたものです。
権限フラグを書き換えただけで、隠れていた管理者メニューがそのまま開きました。「利用者一覧(架空データ)」が見えたはずです。
何が起きたのか
権限の判定に使う値(session.role)がブラウザの中にありました。ブラウザの中にあるものは、その持ち主(=利用者、そして攻撃者)が自由に書き換えられます。だから「表示しない」「無効化する」「隠す」は、見た目を変えるだけで、守りにはなりません。
同じことは、いろいろな形で現れます。
- 「金額」や「割引率」を、送信フォームの hidden 項目に入れておく → 書き換えられる。
- 「この機能は有料会員だけ」の判定を JavaScript だけで行う → 突破される。
- 「URL を知っている人しか来ない」前提で、認可チェックを省く → 直接アクセスされる。
持ち帰る一言
守りは、サーバ側に置く。 クライアントに渡した瞬間、それは利用者の手の中にあります。UI で「隠す」のは体験のためであって、権限や金額のような信用が必要な判定は、必ずサーバ側で確かめ直す。これが、クライアントを信じない設計の芯です。
3つ触りました。最後に、ここから先へどうつながるかをまとめます。
こうなっていればOK
卒業まであと1章です。
この章はまだ完了していません。
保存できませんでした(プライベートブラウズ中かもしれません)。この端末に進捗は残りませんが、先へは進めます。