SECCON 2014 横浜大会に参加してきました。2 日目の Web 予選は 5 問中 3 問を解いて通過できましたが、最終日のクイズ大会では 1 戦目であえなく撃沈。
予選中に書いたメモを元に write-up を書いてみます。
10.10.10.35 で、URL を入力するとそのページのスクリーンショットを返してくれるウェブサイトが動いていました。
view-source:10.10.10.35 を見ると下部に背景と同じ色のリンク (/private/) が隠されていることが分かります。
/private/ にアクセスすると localhost only と表示されました。
localhost からアクセスすれば閲覧できるのではと考えて http://localhost/private/ と入力すると index が表示されたスクリーンショットが返ってきました。
このスクリーンショットから /private/ 下に FLAG1 ls.txt というファイルと AdminLogin というディレクトリがあることが分かります。
この情報から先ほどと同様に http://localhost/private/FLAG1 と入力すると SECCON{screenshotFromLocalhost!} と表示されたスクリーンショットが。
Flag: screenshotFromLocalhost!
/private/ の index の情報から /private/AdminLogin/ にアクセスするとログイン画面が表示されました。
PHP では strcmp('hoge', array()); # => NULL なのでこの仕様を利用して (恐らく strcmp が使われているであろう) 認証をバイパスしてみます。
ということで /private/AdminLogin/?user=staff&pass[]= で $_GET['pass'] を array にすると staff としてログインできました。
ログイン後 /private/AdminLogin/search.php に飛ばされました。
どうやらユーザの情報が表示されているようで、ここでユーザ名と * で伏せられたパスワードとプロフィールが閲覧できました。
フラッグは staff のプロフィールに書いてありました。
Flag: strcmpBypass??
先ほどログインできた /private/AdminLogin/search.php を攻略します。
/private/AdminLogin/search.php ではユーザの検索を行うことができ、例えば a を入力するとユーザ名に a を含む (case-insensitive) ユーザの情報が表示されました。
' || ' を入力すると全てのユーザの情報が表示されました。このことから SQL インジェクションの脆弱性があることが分かります。
また % を入力しても同様に全てのユーザの情報が表示された。このことから select ... from ... where ... like '%${user}%' ...; のような形で検索していると推測しました。
FLAG3 のプロフィールにこのユーザのパスワードがフラッグであると書かれていたので、SQL インジェクションで抜き出してみます。
どういうわけか ' union select ... だとか ';-- が通らなかった (Internal Server Error が返ってきた) ので、仕方なく substr() で削って文字と比較するのを繰り返す方法で攻めました。
パスワードは SECCON{ から始まるハズだと考え ' and pass like 'SECCON{ と入力したところ、FLAG3 の情報のみが表示されました。
' and substr(pass, 8, 1) >= 'A' and pass like 'SECCON{ のような入力を人力で繰り返して FLAG3 のパスワードを特定! パスワードは SECCON{IamSqlInjM@ST3R} でした。SQLiM@STER。
Flag: IamSqlInjM@ST3R
…この問題、慌てていてちょっと強引な方法で解いてしまった気が。ほかの方の詳しい write-up が読みたいです…。
union select pass, pass, … from usertbl とかそういう感じでパスワードを抜き出すのかな。気になります。
FLAG4 は、10.10.10.35:22 で ssh が動いていることと /private/ls.txt から ***MySSHuserPass.txt があることは確認していたが読み出す方法が思いつかず解けませんでした。
今更考えてるんですが 10.10.10.35/?image=... (本来撮られたスクリーンショットの表示を行う) でディレクトリトラバーサルができたのかな。
10.10.10.35/?url=... で色々試すのに夢中になっていてそちらは全く試していなかったので恐らくそうだと思います。ぐぬぬ。