ログイン
編集不可のページディスカッション情報添付ファイル
CTF/Writeup/tkbctf4/ITF point system

MMA

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文字でエラーになるのは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として実行されてしまった。

なお,運用しているサーバの設定を確認したところ

<FilesMatch ".+\.ph(p[345]?|t|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>

のようにファイル名の末尾に.phpがあるときだけSetHandlerするように設定されていた。

CTF/Writeup/tkbctf4/ITF point system (最終更新日時 2014-11-04 00:34:32 更新者 ytoku)