= ITF point system (web 300) = 解けなかった。 最初の認証画面のようなものは実際に認証を行っているわけではないが,ユーザ名には`/^[A-Za-z0-9._-]*+/`の制限がかかっている。 ここで入力したユーザ名とパスワードに基づいて`/db/ユーザ名@パスワードを元にしたなんかのハッシュ値.db`というファイル名でSQLite3データベースが作成される。 ログイン後は,名前とポイントをテーブルに追加する機能があるが,これは容易にSQLインジェクションを行うことが出来る。また,データベースファイルそのものをダウンロードする機能がある。 ダウンロードしたデータベースファイルにはpointというテーブルと追加したレコードが含まれるのみである。 {{{ sqlite> .schema CREATE TABLE point (name TEXT UNIQUE, point INTEGER); }}} まず,ATTACH DATABASEすることを考えたが,複文クエリが実行されなかった。最初の文だけ実行されて,後ろの文は無視されてしまう。 {{{ a', 0); INSERT INTO point VALUES ('b', 1); -- →bがinsertされない }}} それならとユーザ名を操作してPHPスクリプトとして実行されるファイルを作成できないかと考える。 最初に気になるのは正規表現でやらかすお馴染みの改行で,実際,改行はバリデーションから漏れていた。 {{{ username=hoge%0a →hoge[改行]@f5f6c975feaf37d67249eed6e487ee1d.dbの様なファイル名 }}} ダウンロード時のリダイレクトは正常に動作しなくなるものの,特に利用できる脆弱性には繋がらなかった。 GNU/Linuxのファイル名には256文字制限があったりするので,長いユーザ名も試してみると, * 220文字以上ではログイン時にServer error * 212文字以上ではログイン後の画面が真っ白 となる。 220文字でエラーになるのは220+1+32+3=256よりファイル名が256文字以上となったためである。 212文字以上にした時には,データベースファイル自体は作られているが中身が空であった。SQLiteで開くときに失敗しているのではないだろうか。 いずれにしろ,これも利用できる脆弱性には繋がらなかった。 ついでに.htで始まるユーザを作成するとダウンロードできないデータベースファイルを作ることができた。やったね。 以上のような試行を経て結局,解くに至らなかったわけであるが,解説によるとファイル名を"〜.php.〜"の形にすれば良いらしい。何故試さなかったのか。 さて,ドキュメントを読んでみると確かに[[http://httpd.apache.org/docs/2.0/ja/mod/mod_mime.html#multipleext]]に複数拡張子が付いている時の挙動が書いてあり,テスト環境で`AddHandler application/x-httpd-php .php`にして`test.php.txt`を開いたところ確かにPHPとして実行されてしまった。 なお,運用しているサーバの設定を確認したところ {{{ SetHandler application/x-httpd-php }}} のようにファイル名の末尾に.phpがあるときだけ!SetHandlerするように設定されていた。