やられアプリ BadTodo - 15 アクセス制御や認可制御の欠落

前回:やられアプリ BadTodo - 14 セッション管理の不備 - demandosigno

ウェブサイトには「ユーザ権限」「管理者権限」のように権限分けされているものがあります。しかし管理者権限でしか閲覧できない画面をユーザ権限で閲覧できてしまったり、ユーザ権限から管理者権限に昇格できてしまったりすると問題です。

では確認していきます。ウェブ健康診断 仕様 p.20(L) 認可制御の不備、欠落

URL 操作により、現在のユーザでは実行権限のない機能が実行可能

管理者権限を持つユーザは「会員一覧ページ(userlist.php)」を閲覧できます。

一方、一般権限では会員一覧ページへのリンクが出てきません。

ただ、URLを userlist.php と書き換えて直接アクセスすると、

アクセスできてしまいました。問題ありです。

そのまま admin のページを開き、試しに各種変更ボタンを押してみると「権限がないか、そのユーザは存在しません」となります。

メールアドレス変更画面

しかし、メールアドレスの変更画面だけは入ることができ、そのままメールアドレスを変更できました。メールアドレスを変更できると、パスワード再発行メールからパスワードの変更まで可能となってしまいます。

「会員一覧ページ」の「新規追加」から会員の新規作成も可能ですが、これは通常の会員登録画面から行える操作と同じで問題ありません。(ただし後述の通り新規登録リクエストを改変することで権限の操作が可能です)

文書 ID、注文番号、顧客番号等がパラメータにより指定されている場合、そのID 類を変更して元々権限のない情報を閲覧できるか

マイページに入りURLを確認すると「id=5」と自分のID番号が表示されています。

これを他の番号に書き換えると他者のプロフィールが閲覧できてしまいます。

Todoの item パラメータでも

管理者権限では「公開」設定となっていない他のユーザのTodoも閲覧することができます。

一般権限では他のユーザの非公開のTodoは表示されません。

しかしまず自分のTodoリスト閲覧画面に入り、URLのitemパラメータを10から9に変更してみると、本来閲覧できないはずの「非公開」の他人のTodoリストが閲覧可能できてしまいます。こちらも問題ありです。

権限の変更

一般ユーザでログインし、マイページから変更画面に入ると「管理者権限」というチェックボックスが見えます。ただ、クリックしてもチェックを入れることはできません。

しかしブラウザのデベロッパーツールから当該箇所を確認し"disabled"となっている所を"checked"と書き換えるとチェックボックスにチェックが付きます。そのまま変更ボタンをクリックすると変更が完了します。

その後、一旦ログアウトして再度ログインすると管理者権限で操作可能となります。

新規会員登録時の権限変更

一般の新規ユーザは、一般権限でしか登録できません。しかしユーザー登録時のリクエストをBurpSuiteなどでキャプチャしリクエストボディに"&super=1"を加えて送信することで管理者権限で登録できます。

今回は管理者権限を操作することで"super=1"というパラメータと入力位置を見つけましたが、一般権限ユーザのみしか扱えなかった場合にこの点を見つけることができるかは少し難しい気がします。(前述の「権限の変更」の際にこの値を見つけているとはいえ、それを新規登録時に使えると判断するだけの情報を一般ユーザでは見つけられませんでした。しかし「ウェブ健康診断仕様」のチェック項目3つ目に記載の通り『hidden, Cookie に現在権限が指定されており、その変更により現在のユーザでは実行権限のない機能が実行可能』という観点で値を探すのが本来の方法となります)

と、書いた後でこのパターンがありました。↓

Cookieでの権限指定

ログイン時に「ログインしたままにする」というチェックボックスにチェックを入れてログインします。

すると AUTOLOGIN というCookieが発行されます。

値は次の通りとなりますが、
O%3A4%3A%22User%22%3A3%3A%7Bs%3A8%3A%22%00User%00id%22%3Bs%3A1%3A%223%22%3Bs%3A12%3A%22%00User%00userid%22%3Bs%3A4%3A%22test%22%3Bs%3A11%3A%22%00User%00super%22%3Bs%3A1%3A%220%22%3B%7D
開発ツールの「デコードされたURLを表示する」にチェックを入れるとデコードされた値を確認できます。
O:4:"User":3:{s:8:"Userid";s:1:"3";s:12:"Useruserid";s:4:"test";s:11:"Usersuper";s:1:"1";}
シリアライズ化されたデータのようです。改行を入れてみます。
O:4:"User":3:
{
s:8:"Userid";s:1:"3";
s:12:"Useruserid";s:4:"test";
s:11:"Usersuper";s:1:"0";
}

この Cookie値のUsersuperの値を"0"から"1"に書き換えリロードすると、管理者権限になることができます。

更新がうまくいかない場合は「TODOSESSID」を右クリックして削除した後に「一覧」をクリックするなどして再読み込みしてみてください。

続けてUseridの値も"1"に書き換えます。Useruseridを"test"のままにしているため、右上のこんにちは上は「test」さんとなっていますが

マイページを確認すると"id=1"番の管理者に成りすませていることが分かります。

次回:やられアプリ BadTodo - 16 バッファオーバーフロー - demandosigno

/* -----codeの行番号----- */