問題

Nyan Cat!

@app.get("/cat")
def cat():
    file = request.args.get("file", "app.py")
    if not Path(file).exists():
        return "🚫"
    if "flag" in file:
        return "🚩"

    return subprocess.run(
        ["cat", file],
        capture_output=True,
        timeout=1,
        stdin=open("flag.txt"),  # !!
    ).stdout.decode()

TL;DR

解法

こんな感じでファイルが読める感じのサイトとなっている。

image.png

ファイルを読む条件は2つで

  1. 存在すること
  2. “flag”を含まないこと

subprocess.runの引数をよく見ると、標準入力に”flag.txt”を与えている。

cat は標準入力とファイル指定ではファイル側が優先されるので、

入力を示すファイルを与えれば解決

解法1