NSS [NISACTF 2022]babyupload

简介: NSS [NISACTF 2022]babyupload

NSS [NISACTF 2022]babyupload

源码给了提示,/source路径

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

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 """<!DOCTYPE html>
<html>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="file">
    <input type="submit" value="Upload File" name="submit">
</form>
<!-- /source -->
</body>
</html>"""


@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/<id>')
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、随便选择一个文件

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

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

目录
相关文章
|
安全 数据安全/隐私保护
陇剑杯WP - Webshell详细题解
陇剑杯WP - Webshell详细题解
866 0
|
PHP
NSS [NISACTF 2022]level-up
NSS [NISACTF 2022]level-up
216 0
|
应用服务中间件 PHP nginx
NSS [HNCTF 2022 WEEK2]easy_include
NSS [HNCTF 2022 WEEK2]easy_include
198 0
|
JSON 开发框架 网络安全
[网络安全] Dirsearch 工具的安装、使用详细教程
[网络安全] Dirsearch 工具的安装、使用详细教程
8468 0
|
存储 SQL 缓存
Ctfshow web入门 PHP特性篇 web89-web151 全(一)
Ctfshow web入门 PHP特性篇 web89-web151 全(一)
803 0
NSS [SWPUCTF 2022 新生赛]where_am_i
NSS [SWPUCTF 2022 新生赛]where_am_i
200 0
|
存储 JSON 数据安全/隐私保护
[LitCTF 2023]Flag点击就送!(cookie伪造)
[LitCTF 2023]Flag点击就送!(cookie伪造)
571 0
NSS [SWPUCTF 2021 新生赛]pop
NSS [SWPUCTF 2021 新生赛]pop
194 0
|
SQL Python
[CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解
[CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解
1143 0
[CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解
|
Ubuntu 网络安全 开发者
CTF本地靶场搭建——GZ:CTF安装
GZCTF是一个开源的网络安全竞技平台,由GZTimeWalker维护,提供环境供爱好者和专业人士通过解决CTF题目提升技能。本文档介绍了在Ubuntu 20.04上部署GZCTF的步骤,包括安装操作系统、配置清华镜像源、更新软件、安装Docker和docker-compose,以及根据GZCTF文档创建配置文件并启动服务。完成部署后,用户可在浏览器中看到GZCTF平台。