NSS [NISACTF 2022]babyupload

NSS [NISACTF 2022]babyupload

源码给了提示,/source路径

NSS [NISACTF 2022]babyupload_第1张图片

访问后得到一个文件,是源码

from flask import Flask, request, redirect, g, send_from_directory
import sqlite3
import os
import uuid

app = Flask(__name__)

SCHEMA = """CREATE TABLE files (
id text primary key,
path text
);
"""


def db():
    g_db = getattr(g, '_database', None)
    if g_db is None:
        g_db = g._database = sqlite3.connect("database.db")
    return g_db


@app.before_first_request
def setup():
    os.remove("database.db")
    cur = db().cursor()
    cur.executescript(SCHEMA)


@app.route('/')#返回源码】
def hello_world():  
    return """


Select image to upload:
"""
@app.route('/source')#访问时下载文件】 def source(): return send_from_directory(directory="/var/www/html/", path="www.zip", as_attachment=True) @app.route('/upload', methods=['POST']) def upload(): if 'file' not in request.files: return redirect('/') file = request.files['file'] if "." in file.filename:#过滤了带文件名中带 . 的文件。】 return "Bad filename!", 403 conn = db() cur = conn.cursor() uid = uuid.uuid4().hex#这个代码是进行一个sql语句,表示增加一个数据,数据为uid和文件名。】#因此我们只需要传输一个文件名为/flag的文件就可以得到flag的uid。然后再访问对应路径就可以得到flag】 try: cur.execute("insert into files (id, path) values (?, ?)", (uid, file.filename,)) except sqlite3.IntegrityError: return "Duplicate file" conn.commit() file.save('uploads/' + file.filename) return redirect('/file/' + uid) @app.route('/file/') def file(id): conn = db() cur = conn.cursor() cur.execute("select path from files where id=?", (id,)) res = cur.fetchone() if res is None: return "File not found", 404 # print(res[0]) with open(os.path.join("uploads/", res[0]), "r") as f: return f.read() if __name__ == '__main__': app.run(host='0.0.0.0', port=80)

解题

1、随便选择一个文件NSS [NISACTF 2022]babyupload_第2张图片

2、抓包,修改文件名字为/flag

NSS [NISACTF 2022]babyupload_第3张图片

3、访问返回的文件路径即得flag

NSS [NISACTF 2022]babyupload_第4张图片

你可能感兴趣的:(CTF-web(零散wp合集),web安全)