ksnctfにチャレンジ 第26問目です。
※ksnctfは常駐型のCTFサイトです。 ※問題のページはコチラです。
Sherlock Holmes
開いてURLを見た瞬間に大体察しが付きます。
と同じです。 perlの open 関数は | 付きの文字列をOSのコマンドと認識するので 今回のように URLで指定されたテキストファイルをそのまま perlの open で処理していると思われる場合有効です。
flag.txt があるのでこれで終わりかと思うと
ハズレでした おそらく /~q26/index.pl/flag.txt というパスを直接予想してしまった人対策だと思い、 素直に
/|cat index.pl を実行してソースをみると、 h@cl3d! とかかれたファイルが存在すれば FLAG_n6… を表示する とあります あれ…もうフラグ見えてません?
どうやら 作問者の意図としては URLからURL末尾のファイル名がそのまま読み込まれていると考え ディレクトリトラバーサル的に /~q26/index.pl/flag.txt /~q26/index.pl/index.pl を経由するのが正規ルートぽいです。 この表示を見てから、ディレクトリにファイルを生成することが 必要だとわかり、そのための方法として OSコマンドインジェクションにたどり着く という想定っぽいです。 初手でコマンドインジェクションだと気づいてしまうと しれっとフラグが見えてしまうので粋じゃない(意味不明)です
ということで一応正規ルートに乗れば OSコマンドインジェクションで h@ck3d! と書かれた crack.txt というファイルを生成すれば良いので
/~q26/index.pl/|echo 'h@ck3d!' > cracked.txt 一度実行してから /~q26/index.pl/ にアクセスすると
"ちゃんと" FLAGがとれます。