コース目次 / 第2章
旗B — パラメータを信じた、昇格
role=guestで動くAPIに、role=adminを渡して権限を昇格させ、2つめの旗を取得します。sec-securecodingの「信じるものを明示する」原則との対応を確認します。
前章のコメントに、もう一つヒントがありました——fetch('/api/photos?role=guest')。role というパラメータが、目立つ場所にあります。
正規の動き
curl "http://127.0.0.1:4500/api/photos?role=guest"
{"photos":["public1.jpg","public2.jpg"]}
値を、変えてみる
CTFでは、「動いているパラメータを見つけたら、まず値を変えてみる」のが定石です。guest の対になりそうな値を試します。
curl "http://127.0.0.1:4500/api/photos?role=admin"
{"photos":["public1.jpg","public2.jpg"],"flag":"flag{8de339a46f155c6d}"}
取れました。サーバは、role というクライアントからの申告を、そのまま信じていました。sec-authz・sec-api で繰り返し見た「事実はサーバが持つ」の裏返しです——ここでは、「あなたのロールは何か」という事実を、サーバではなくクライアントの自己申告に委ねていました。
この2つの旗を、並べて見る
旗A(隠しエンドポイント)は「見えない場所を探す」、旗B(パラメータ昇格)は「見えている値を疑う」——アプローチは正反対に見えます。でも、根っこは同じです。どちらも、サーバが「クライアントの言い分をどこまで信じているか」の甘さでした。CTFで旗を探すときは、この2つの問い——「隠れているものは無いか」「見えている値は本当に固定か」——を、いつもセットで持っておくと漏れが減ります。
持ち帰る一言
動いているパラメータは、値を変えて試す。 role=guest が効くなら role=admin も効くかもしれない——この単純な疑いが、しばしば旗に直結します。次はまとめて、このコースを締めます。
こうなっていればOK
卒業まであと1章です。
この章はまだ完了していません。
保存できませんでした(プライベートブラウズ中かもしれません)。この端末に進捗は残りませんが、先へは進めます。