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

MMA
1と2のリビジョン間の差分
2014-11-03 21:43:18時点のリビジョン1
サイズ: 32
編集者: ytoku
コメント:
2014-11-04 00:33:25時点のリビジョン2
サイズ: 3441
編集者: ytoku
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 2: 行 2:
解けなかった。

最初の認証画面のようなものは実際に認証を行っているわけではないが,ユーザ名には`/^[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として実行されてしまった。

なお,運用しているサーバの設定を確認したところ
{{{
<FilesMatch ".+\.ph(p[345]?|t|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>
}}}
のようにファイル名の末尾に.phpがあるときだけ!SetHandlerするように設定されていた。

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として実行されてしまった。

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

<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)