コース目次 / 第2章

垂直の穴 — 上位権限に、手が届く

一般ユーザーのまま管理者用の機能に直接アクセスし、機能レベル認可の欠陥(BFLA)を突きます。UIに出ないことが守りにならないこと、フォースブラウジングの発想を掴みます。

第2章 / 全5章目安 約10分この章のゴール: 垂直の権限昇格を起こし、機能レベル認可の欠落を見抜けるようになる

前章と同じポータル(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章です。

この章はまだ完了していません。