[NISACTF 2022]babyupload

2023-11-13

[NISACTF 2022]babyupload

本题考点
  1. python代码审计
  2. os.path.join() 处理路径拼接的问题
做题过程
  1. 经典的文件上传页面,F12查看源码

    <!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>
    
  2. 发现/source路径,访问后得到源码,然后进行代码审计

    from flask import Flask, request, redirect, g, send_from_directory
    import sqlite3
    import os
    import uuid  # 通用唯一识别码(Universally Unique Identifier),标准格式为xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx
    
    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  # 生成文件的uuid
        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)  # 保存文件在uploads/下
        return redirect('/file/' + uid)  # 返回文件的uuid
    
    
    @app.route('/file/<id>')
    def file(id):  # 访问文件
        conn = db()
        cur = conn.cursor()
        cur.execute("select path from files where id=?", (id,))  # 根据文件uuid,在数据库中查询文件名
        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:  # 将查询到的文件名与uploads/拼接
            return f.read()
    
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=80)
    
    
  3. 综上,后端代码的逻辑如下:上传的文件不能有后缀名,上传后生成一个uuid,并将uuid和文件名存入数据库中,并返回文件的uuid。再通过/file/uuid访问文件,通过查询数据库得到对应文件名,在文件名前拼接uploads/后读取该路径下上传的文件。

  4. 但肯定要想如何读取 flag 文件,在文件名前被uploads/拼接意味着只能读取上传后的文件,而且上传的文件没有后缀名,不能直接利用,但os.path.join()函数存在绝对路径拼接漏洞

    绝对路径拼接漏洞

    os.path.join(path,*paths)函数用于将多个文件路径连接成一个组合的路径。第一个函数通常包含了基础路径,而之后的每个参数被当作组件拼接到基础路径之后。

    然而,这个函数有一个少有人知的特性,如果拼接的某个路径以 / 开头,那么包括基础路径在内的所有前缀路径都将被删除,该路径将视为绝对路径

  5. 由此,当上传的文件名为 /flag ,上传后通过uuid访问文件后,查询到的文件名是 /flag ,那么进行路径拼接时,uploads/ 将被删除,读取到的就是根目录下的 flag 文件。

  6. 使用BurpSuite抓包后,修改文件名为 /flag 后发包,利用/file/uuid即可读取 flag。
    在这里插入图片描述
    在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[NISACTF 2022]babyupload 的相关文章

  • Celery计划任务中的打印语句不会出现在终端中

    当我跑步时celery A tasks2 celery worker B我想看到每秒打印 芹菜任务 目前没有打印任何内容 为什么这不起作用 from app import app from celery import Celery from
  • 带有指针数组的 cython

    我在 python 中有一个 numpy ndarrays 列表 具有不同的长度 并且需要非常快速地访问 python 中的列表 我认为指针数组就可以解决问题 我试过 float type t list of arrays no of ar
  • 创建圆形图像 PIL Tkinter

    Currently I have a zoom feature in my application that works very well however I d like the actual zoom box to be a circ
  • 使用信号时出现 django TransactionManagementError

    我有一个与 django 的用户和 UserInfo 一对一的字段 我想订阅用户模型上的 post save 回调函数 以便我也可以保存 UserInfo receiver post save sender User def saveUse
  • 创建一个打开文件并创建字典的函数

    我有一个正在处理的文件 我想创建一个读取文件并将内容放入字典中的函数 然后该字典需要通过 main 函数传递 这是主程序 它无法改变 我所做的一切都必须与主程序配合 def main sunspot dict file str raw in
  • 在 Python 3 中动态导入模块的问题

    我遇到的情况是 在我的 Python 3 项目中 在运行时必须包含某些模块 我在用着importlib import module为了这 第二次更新 我确实找到了一种方法来做一些接近我想要的事情 一些额外的代码可能会使我的一些链接稍微偏离一
  • 有条件填写 pandas 数据框

    我有一个数据框df列中包含浮点值A 我想添加另一列B这样 B 0 A 0 for i gt 0 B i if np isnan A i then A i else Step3 B i if abs B i 1 A i B i 1 lt 0
  • Django 如何从 ManyToManyField 序列化并列出全部

    我正在使用 Django 1 9 1 开发移动应用程序后端 我实现了关注者模型 现在我想列出用户的所有关注者 但目前我不得不这样做 我还使用 Django Rest 框架 这是我的 UserProfile 模型 class UserProf
  • Python 使用 M2Crypto 通过 S/MIME 对消息进行签名

    我现在花了几个小时 但找不到我的错误 我想要一个简单的例程来创建 S MIME 签名消息 稍后可以与 smtplib 一起使用 这是我到目前为止所拥有的 usr bin python2 7 coding utf 8 from future
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 十六进制数的按位异或

    我们如何在 Python 中对十六进制数进行异或 例如 我想要异或 ABCD and 12EF 答案应该是 B922 我使用了下面的代码 但它给出了错误的结果 xor two strings of different lengths def
  • 在 keras 中使用自定义张量流操作

    我在张量流中有一个脚本 其中包含自定义张量流操作 我想将代码移植到 keras 但我不确定如何在 keras 代码中调用自定义操作 我想在 keras 中使用tensorflow 所以到目前为止我发现的教程描述了与我想要的相反的内容 htt
  • Selenium Webdriver - Python - leboncoin - pb 选择带重音的按钮

    我正在尝试在以下网站上自动填写表格 https www leboncoin fr https www leboncoin fr 我用 Selenium IDE 录制了一个脚本 我有一个通过单击 Se 连接器 按钮并填写我的密码和用户名来自动
  • 当 DetailView 遇到时更新模型字段。 [姜戈]

    我有一个类似的 DetailViewviews py views py class CustomView DetailView context object name content model models AppModel templa
  • InvalidArgumentException:消息:无效参数:“using”必须是字符串

    我对 python 很陌生 试图创建可重用的代码 当我尝试通过传递 Login 类下使用的所有参数来调用 test main py 中的 Login 类和函数 login user 时 我收到错误 InvalidArgumentExcept
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 管理文件字段当前 url 不正确

    在 Django 管理中 只要有 FileField 编辑页面上就会有一个 当前 框 其中包含指向当前文件的超链接 但是 此链接会附加到当前页面 url 因此会导致 404 因为不存在这样的页面 例如 http 127 0 0 1 8000
  • Python 垃圾收集有时在 Jupyter Notebook 中不起作用

    我的一些 Jupyter 笔记本经常出现 RAM 不足的情况 而且我似乎无法释放不再需要的内存 这是一个例子 import gc thing Thing result thing do something thing None gc col
  • Flask SQLAlchemy 与 MyPy - 模型类型错误

    我遇到了以下组合问题flask sqlalchemy and mypy 当我定义一个新的 ORM 对象时 例如 class Foo db Model pass where db是使用创建的数据库SQL炼金术应用于flask app mypy
  • Jupyter Notebook 中的多处理与线程

    我试图测试这个例子here https ipywidgets readthedocs io en stable examples Widget 20Asynchronous html将其从线程更改为多处理 在 jupyter Noteboo

随机推荐

  • Linux系统简介

    文章目录 1 UNIX与Linux发展史 1 1 UNIX发展史 1 2 Linux发展史 1 2 1 Linux内核版本 1 2 2 Linux主要发行版本 2 开源软件简介 2 1 典型的开源软件 2 2 开源软件的特点 2 3 支撑互
  • MATLAB实现多分类预测结果混淆矩阵(Confusion matrix)可视化

    对于多分类问题 如何对预测结果进行可视化分析是性能对比的关键 在实际多分类问题 除了简单展示模型预测精度外 如何理解不同类别之间的预测结果对于分析样本相关性和属性区别具有重要意义 在MATLAB中一般通过混淆矩阵confusion matr
  • Uber和它的规则&算法

    私以为 Uber这家公司的出现 标志着 科技重构资源的时代正式来临 这才是大数据真正的使命啊 enjoy 这个改变 以下信息来源 网络上流传的中文Uber解读 Uber的算法 均可以随着数据量的不断增加进行学习 所以只会越来越准 只会越来越
  • MySQL将一张表的数据copy到另一张表中

    1 复制旧表的数据到新表 假设两个表结构一样 INSERT INTO 新表 SELECT FROM 旧表 INSERT INTO tbl user copy SELECT FROM tbl user 2 复制表结构及数据到新表 CREATE
  • Keil不能正确生成.bin文件的解决办法

    1 打开keil IDE 然后打开help gt uVison Help 搜索fromelf关键字如下图1 然后再进入到右下角的索引找到fromelf命令行的语法和选项 找到 bin的说明如下 如红色标注所说 正是症结所在 即如果链接文件中
  • 安装ubuntu20.04(安装vim、gcc、VMtools、中文输入法、汉化、修改IP、无法连网问题)

    目录 ubuntu安装包获取 ubuntu的安装 安装网络配置命令ifconfig 连接网络 解决ubuntu无法连网问题 如何修改IP地址 安装VMtools 解决VMware Tools选项灰色 VMtools安装 安装中文 汉化 添加
  • 时间序列预测——GRU

    本文展示了使用GRU进行时间序列预测的全过程 包含详细的注释 整个过程主要包括 数据导入 数据清洗 结构转化 建立GRU模型 训练模型 包括动态调整学习率和earlystopping的设置 预测 结果展示 误差评估等完整的时间序列预测流程
  • 针对序列级和词元级应用微调BERT(需修改)

    对于序列级和词元级自然语言处理应用 BERT只需要最小的架构改变 额外的全连接层 如单个文本分类 例如 情感分析和测试语言可接受性 文本对分类或回归 例如 自然语言推断和语义文本相似性 文本标记 例如 词性标记 和问答 在下游应用的监督学习
  • 7-22龟兔赛跑/PTA基础编程题目集

    7 22 龟兔赛跑 20分 乌龟与兔子进行赛跑 跑场是一个矩型跑道 跑道边可以随地进行休息 乌龟每分钟可以前进3米 兔子每分钟前进9米 兔子嫌乌龟跑得慢 觉得肯定能跑赢乌龟 于是 每跑10分钟回头看一下乌龟 若发现自己超过乌龟 就在路边休息
  • 高效的学习方法

    背景 自己在复习自己专业课33页知识点时一筹莫展 死记硬背又记不住 背了上一个再背下一个上一个就忘记了 在复习的时候特别痛苦 而且定义性质的还是不能有错别字的 所以感觉自己背的特别痛苦 而且背完就忘 就像在做无用功 自己也想过用思维导图三遍
  • c++智能指针(一)

    C 智能指针 一 c 中的动态内存的管理是通过一对运算符来管理的 new 在动态内存中为对象分 配空间并返回一个指向该对象的指针 我们可以选择对对象进行初始化 delete 接受一个对象的指针 销毁对象 并且释放与之关联的内存 动态内存的使
  • oracle自动增加表空间指定分区

    Create table create table testTable tjsj DATE not null tablespace tablespace1 PARTITION BY RANGE TJSJ INTERVAL NUMTODSIN
  • spring boot(8)-mybatis三种动态sql

    脚本sql XML配置方式的动态SQL我就不讲了 有兴趣可以自己了解 下面是用
  • Qt之QChart各个图表的简单使用(含源码+注释)

    文章目录 一 图表操作示例图 1 图表选择示例 2 动画选项操作 3 图例选项操作 4 其他选项操作 二 QChart 个人理解 三 部分源码讲解 ui中添加动态属性 按钮组的使用 四 源码 CChartTest h CChartTest
  • [1106]python bezier(贝塞尔)曲线

    文章目录 三阶贝塞尔曲线 python bezier曲线 首先简单了解一下什么是贝塞尔曲线 余弦函数曲线我就不多说了哈 贝塞尔曲线又称贝兹曲线 是法国工程师皮埃尔 贝塞尔于1962年发表 贝塞尔曲线广泛应用于二维绘图软件 早期用于汽车车体设
  • 软件测试中单元测试,集成测试,系统测试,验收测试的区别

    软件测试按照研发阶段一般分为5个部分 单元测试 集成测试 确认测试 系统测试 验收测试 下面将不同阶段需要的一些工作内容做一下梳理希望可以帮助到大家 单元测试 是指对软件中的最小可测试单元进行检查和验证 测试方法 白盒测试 单元测试又称为模
  • Vue一键复制功能

    div class item2 2 span 复制 span div copy content let input document createElement input input value content input id crea
  • JavaScript实现搜索功能

    JavaScript实现搜索功能 实现效果 代码如下
  • npm install 卡在了 reify:rxjs: timing reifyNode,出现 gyp ERR find Python、gyp ERR find VS

    前言 最近跑一个vue的项目 第一步肯定是npm install 结果就出现我标题上写的那些情况 经过一番搜索 网上一堆方法尝试了 有说叫你用管理员权限运行 npm install global production windows bui
  • [NISACTF 2022]babyupload

    NISACTF 2022 babyupload 本题考点 python代码审计 os path join 处理路径拼接的问题 做题过程 经典的文件上传页面 F12查看源码