[日本語] [English]

unzipper

WebページのURLと、以下のファイルが与えられた。

unzipper
|-- Dockerfile
|-- docker-stuff
|   |-- cleanup
|   |-- default
|   `-- www.conf
`-- index.php

index.php は、以下の処理をするものだった。

また、Dockerfile より、ファイル /flag.txt が用意されることが読み取れた。

ここで、各関数の以下の性質を用いる。

読み込むファイルのパスとして file:///flag.txt を指定すると、
readfile 関数はこれをURLと解釈してファイル /flag.txt を読みに行く一方、 realpath 関数はこれをディレクトリ file: 内のファイル flag.txt と解釈する。
この flag.txt をシンボリックリンクにしておくことで、realpath の処理結果から文字列 flag を消し、readfile 関数を実行させることができる。

これを実行するため、まずWebページにファイルを送信するための以下のファイルを用意した。

send.html

さらに、CS50 Sandboxを開き、以下のコマンドでファイル file_flag.zip を作成した。

mkdir file:
cd file:
touch meow.txt
ln -s meow.txt flag.txt
cd ..
zip -ry file_flag.zip file:

作成した file_flag.zipsend.html から送信した後、http://65.108.176.76:8200/?file=file:///flag.txt にアクセスすることで、flagが得られた。

hxp{at_least_we_have_all_the_performance_in_the_world..._lolphp_:/}

writeup by MikeCAT

hxp CTF 2021