コース目次 / 第2章

旗B — パラメータを信じた、昇格

role=guestで動くAPIに、role=adminを渡して権限を昇格させ、2つめの旗を取得します。sec-securecodingの「信じるものを明示する」原則との対応を確認します。

第2章 / 全4章目安 約8分この章のゴール: クライアントパラメータの信頼による権限昇格で、旗を取得できる

前章のコメントに、もう一つヒントがありました——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章です。

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