コース目次 / 第2章
垂直の穴 — 上位権限に、手が届く
一般ユーザーのまま管理者用の機能に直接アクセスし、機能レベル認可の欠陥(BFLA)を突きます。UIに出ないことが守りにならないこと、フォースブラウジングの発想を掴みます。
前章と同じポータル(node vuln-portal.js)を使います。今度は垂直の軸——一般ユーザーが、管理者用の機能に手を伸ばせてしまう穴です。
法と倫理ゲート
手を動かす前に
このコースは攻撃の技術に触れます。実習してよい相手は、次の3つだけです。
- (a) 自分で作った練習用のやられ環境(このサイトが配る自作ターゲット)
- (b) あなた自身の許可された環境(自分の Thousand SKY・secret-notes-ctf など)
- (c) CTF 競技の中(規約の範囲で)
実在する第三者のシステムを許可なく触ることは、不正アクセス禁止法に触れます。 このゲートは、その線引きを毎回の入口で確かめるためのものです。詳しくは「セキュリティの法と倫理」へ。
攻撃 — 管理者機能を、一般ユーザーで叩く
このポータルには、全ユーザーの一覧を返す管理者向けエンドポイント /admin/users があります。まず架空太郎(一般ユーザー)でログインした状態を確かめます。
http://127.0.0.1:3600/login?as=t1
http://127.0.0.1:3600/whoami
role が user と出ます。太郎は管理者ではありません。では、管理者用の URL を直接叩いてみます。
http://127.0.0.1:3600/admin/users
一般ユーザーの太郎のまま、全ユーザーの一覧(管理者・花子を含む)が見えてしまいました。/admin/ という、いかにも管理者専用の場所なのに、「叩いた人が管理者ロールか」を一度も確かめていない。ログイン(認証)は要求しているが、ロール(認可)は見ていない。これが機能レベル認可の欠陥(BFLA:Broken Function Level Authorization)——垂直の権限昇格です。
管理者機能が「全ユーザーの削除」や「他人のパスワード変更」だったら、と考えると、この穴の深刻さが分かります。一般ユーザーが、URL を知る(or 推測する)だけで管理者になれてしまう。
画面に出ないことは、守りではない
「でも、一般ユーザーの画面には管理者リンクなんて表示されないのでは?」——そのとおりです。そして、それが罠です。
多くのアプリは、一般ユーザーには管理メニューを表示しないことで「守ったつもり」になっています。でも、リンクを隠すことと、アクセスを拒むことは、まったく別。URL(/admin/users)を直接ブラウザに打てば、画面のリンクなど関係なく届いてしまう。
旗艦の IDOR で「一覧に出さない」が守りにならなかったのと、同じ話です。守りは画面(クライアント)ではなく、サーバのその機能の入り口に置く。
隠れた機能を、推測して叩く — フォースブラウジング
攻撃者は、画面に出ていない機能を推測して直接叩きます。これをフォースブラウジング(強制ブラウジング)と呼びます。
/admin、/admin/users、/api/admin/…、/debug、/internal——ありがちな管理・内部向けのパスを、ログイン済みの一般ユーザーのセッションで順に叩く。一つでもロールチェックを忘れた機能があれば、そこが垂直の穴です。
だから診断では、「画面に出ている機能」だけでなく、「出ていないはずの機能」に手が届かないかまで確かめます。JavaScript ファイルの中に、管理用 API のパスが書かれていることも多い(クライアントに配られている以上、攻撃者も読めます)。
水平と垂直を、両方試す癖
前章の水平(IDOR / BOLA)と、この章の垂直(BFLA)。認可診断では、この両方を機械的に試します。
一つのエンドポイントに対して、いつも2つ問う——
「同じ立場の他人の資源に手が届かないか?」(水平)
「上位権限の機能に手が届かないか?」(垂直)
この2問を、ログイン済みの低権限アカウントから全機能に投げていく。ツールには分からない、人の目の仕事です。
持ち帰る一言
リンクを隠すのは、守りではない。 垂直の穴(BFLA)は、一般ユーザーが管理者機能に手を伸ばせること。画面に出ないパスも、直接叩けば届く(フォースブラウジング)。水平と垂直の2問を、全機能に投げる。次はいよいよ、この両方を根本から塞ぐ——認可の直し方です。
こうなっていればOK
卒業まであと2章です。
この章はまだ完了していません。
保存できませんでした(プライベートブラウズ中かもしれません)。この端末に進捗は残りませんが、先へは進めます。