東京大学には御殿下記念館と呼ばれる場所があり,トレーニングルーム,ボルダリングウォール,クライミングウォールなど様々な運動のための施設が内部に設置されている.
ただし,それらの設備を使うためには,トレーニング室利用登録講習会/ボルダリング講習会/クライミングウォール講習会を必ず受講しなければならず,それには予約フォームにおける予約が必要となる. とはいえ,東京大学はマンモス校であり,通常は以下のように常に満員となっている.ライブチケットの予約のごとくサイトに張り付き,1ヶ月以上先の予約を抑えねばトレーニングルームを使うことができない.
筆者はこのサイトがPHPで書かれた古典的なサイトであることを踏まえ,ホワイトハッキングの初めてのステップとしてちょうど良いだろうと思い,ハッキングし,予約をインジェクションできうるか調べることにした.結果としてはインジェクション攻撃が可能であることが示された.
この図の通り,受付上限人数を超えた予約済み人数となっている(上限人数でバリデーションを行っていないことが原因と思われる)
この件は御殿下に報告中である. 以下はメモを記す.
URLについて
御殿下予約サイトのURLの例は以下のようになっている.先述した通りPHPで書かれており,予約申し込みページから予約確定ページに遷移する過程でGETで色々パラメタを送っているっぽい.遷移順は「講習会予約日程選択ページ」から日程を選ぶと,「予約申込ページ」に飛び,そこで氏名などの情報を入力させ,「予約確定ページ」へと遷移する.予約確定ページに遷移した時にDBに入力された情報がメールで送信されてくる.
講習会予約日程選択ページ https://www.undoukai-reserve.com/lectureclass/system/prog/select_program.php 予約申込ページ https://www.undoukai-reserve.com/lectureclass/system/prog/reservation_input.php 予約確定ページ https://www.undoukai-reserve.com/lectureclass/system/prog/reservation_finish.php?submode=update&categories_id=1&courses_id=2&date=2024-04-30&starttime=13:30:00&endtime=14:30:00
hiddenタグについて
講習会予約日程選択ページの予約ボタンごとにhiddenタグのvalueが異なっていてForm Actionで同じページに飛ばす仕組みなので,valueを書き換えれば思ったところで予約できる.
course_idは分からんが,時間帯ごとに分けられて管理されているわけではなさそう.トレーニングルームとボルダリング講習会は2,クライミングウォールは5になっていた.
programs_idはページの上から順にユニークな数字が振られている. 現在の予約人数はwhere(program_id=hoge)をcountした値が貼られている.
program_idと開催日時の紐付けが多分DBのテーブルで行われていて,多分格納している値はprogram_idとユーザの情報だけ. 5月17 13:30-のが3519で5月2413:30-が3520(講習日時の時系列順ではないため注意!).(他のメモ.3522ダメ.3527は5月20日17:30〜.3525が5月18日17:30~.) date, starttime, endtimeの値が予約完了メールに使われて送信されるけど,dbにはprogram_idや名前などが格納されてるだけでこれらの値は格納されてない(なのでdateとprogram_idに不整合があるリクエスト送ったらprogram_idの方の日時が優先される).
submodeがnewの場合とupdateの場合の動作の違いはメール文が変わるだけっぽそう?(予約してる状態でupdateのリクエスト送ったら一旦予約解除しろというページに遷移したので,既存のDBの情報を更新してくれるわけではなかった.)
order_limitはなんだろう?満員か否かのフラグかと思ったけど,いじらなくても定員オーバーで予約できた.
hiddenでvalueを渡す形式ってどうなんだろうと思って最近のサイト見てみたら,hot pepper beautyの予約サイトとかGatsby公式サイトはhiddenタグのvalueが空だった.このあたりがどう動作してるかあんまり分からない.セッション情報をうまく使って分岐させている?
予約完了ページのこれらのタグについてはまだ調査できていない.
developer toolってページの表層上の見た目を書き換えるだけかと思ってたけど,ちゃんとvalueを書き換えれば,リクエストも変更後のが送られるので便利だと思った.
developer tool使えばwebフォントも出てくるの知らなかった.便利