はまやんはまやんはまやん

hamayanhamayan's blog

security_question [UIUCTF 2020]

CTFtime.org / UIUCTF 2020 / security_question

Someone just asked a very interesting question online. Can you help them solve their problem?
https://security.chal.uiuc.tf/
author: Husincostan

f:id:hamayanhamayan:20200724112559p:plain

Stack Overflowの嘘サイトが出てくる。
質問文にあるソースコードには/getpoemエンドポイントが提示されているので、アクセスするとコードにあった応答が帰ってくる。

@app.route('/getpoem')
def get_poem():
    poemname = request.args.get('name')

    if not poemname:
        return 'Please send a name query:\n' + str(os.listdir('poems')), 404

    poemdir     = os.path.join(os.getcwd(), 'poems')
    poempath    = os.path.join(poemdir, poemname) 

    if '..' in poemname:
        return 'Illegal substring detected.', 403
    
    if not os.path.exists(poempath):
        return 'File not found.', 404

    return send_file(poempath)

/getpoemにアクセスするとPlease send a name query: ['rise.txt', 'daddy.txt', 'tyger.txt', 'road.txt']と来る。
/getpoem?name=rise.txtにアクセスすると、ファイルの中身が得られる。
問題文には/hidden_poem.txtにアクセスして情報を抜き取るよう指令が書いてある。

なぜか取れてしまう

特に何も考えずに、/getpoem?name=/hidden_poem.txtにアクセスするとフラグが出てくる。
なぜだろうか。

os.path.join is weird in python3

python3のjoinはこんな挙動をする。

>>> import os
>>> print(os.path.join('/home', 'flag.txt'))
/home/flag.txt
>>> print(os.path.join('/home', '/flag.txt'))
/flag.txt

冷静になって考えると、まあ、そうかという感じがする。
ルートパスに対して、相対パス指定と絶対パス指定をすると、結果はそうなるか。