ディレクトリトラバーサル 08 - yujitounai/helloworld GitHub Wiki
ディレクトリトラバーサル-08
Pythonのos.path.join関数の仕様を利用したディレクトリトラバーサル
os.path.join("aaa", "bbb") 'aaa/bbb' os.path.join("aaa", "/bbb") '/bbb' os.path.join("aaa", "/bbb", "ccc") '/bbb/ccc'
となってしまう
脆弱なソースコード (Python)
import urllib.request
import os
from flask import Flask, request
app = Flask(__name__)
@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)
def send_file(poem):
f = open(poem, 'r')
data = f.read()
f.close()
return data
if __name__ == "__main__":
app.run(debug=False, host="0.0.0.0", port=8000)
poemname = request.args.get('name')
poemdir = os.path.join(os.getcwd(), 'poems')
poempath = os.path.join(poemdir, poemname)
なのでpoemnameに/があるとパスが無視される
攻撃方法
http://localhost:8000/getpoem?name=/etc/hosts