[NISACTF 2022]babyupload

news2025/1/23 13:04:17

[NISACTF 2022]babyupload wp

信息搜集

进入页面:

在这里插入图片描述

尝试文件上传,但是各种后缀名我都试过了,过不去。

在源码中发现提示,存在 ./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
    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)

这道题的要求就两个:看懂 python 代码;os.path.join 绝对路径拼接。

加强 python 基础

为了能更好的看懂本次 python 代码,我推荐以下文章:

python 连接数据库

Python getattr() 函数

关于python中的查询数据库内容中用到的fetchone()函数

request.files 介绍

在 Flask 框架中,request.files 是一个代表上传文件的特殊字典对象。它允许您访问用户通过 HTTP 请求上传的文件。具体来说,在 Flask 中,当您的应用程序收到一个带有文件上传的 POST 请求时,可以使用 request.files 来获取上传文件的信息。

request.files 是一个字典,它的键是文件域( input 标签的 name 属性值),而值是一个 FileStorage 对象,该对象提供了访问和操作上传文件的方法和属性。

例如,假设您的 HTML 表单中有一个文件上传域,其 name 属性为 "file"

<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>

那么您可以通过以下方式访问上传文件:

file = request.files['file']

上面的代码将返回上传文件的 FileStorage 对象,您可以使用该对象的方法和属性来获取文件的详细信息,如文件名、内容类型、保存文件等:

filename = file.filename          # 获取上传文件的文件名
file.save('/path/to/save/file')   # 将上传文件保存到指定路径

通过 request.files,您可以轻松地处理和管理用户上传的文件数据。注意,为了使用 request.files,您的请求必须使用 enctype="multipart/form-data" 编码类型,这是用于文件上传的标准编码类型。

关于 python 的 flask 框架,在学 SSTI 模板注入时有所学习。

源码分析

# 设置了一个路由,当以 POST 方式访问 ./upload 页面时,就会触发 upload() 函数
@app.route('/upload', methods=['POST'])
def upload():
    if 'file' not in request.files:
        return redirect('/')
# 从 HTML 表单中获取 file 对象,即用户上传的文件
    file = request.files['file']
# 文件名中不能有小数点
    if "." in file.filename:
        return "Bad filename!", 403
# 调用 db() 函数连接数据库
    conn = db()
    cur = conn.cursor()
# 调用 uuid 模块以某种方式生成文件的 uid
    uid = uuid.uuid4().hex
    try:
        cur.execute("insert into files (id, path) values (?, ?)", (uid, file.filename,))
    except sqlite3.IntegrityError:
        return "Duplicate file"
    conn.commit()
# 将文件保存到 ./uploads/ 路径下
    file.save('uploads/' + file.filename)
# 返回最终保存的文件路径
    return redirect('/file/' + uid)

不过在此段代码中 file.save('uploads/' + file.filename) 并没有起到作用,推测原因是 uploads/ 路径不存在。

下面来看这段代码:

# 设定路由,当访问 /file/<id> 路径时触发 file 函数,其中 <id> 为用户输入的任意值,该值会被作为 file 函数的参数值
@app.route('/file/<id>')
def file(id):
# 连接数据库
    conn = db()
    cur = conn.cursor()
# 执行 SQL 语句,根据 id 查找 path
    cur.execute("select path from files where id=?", (id,))
# fetchone 函数的作用在上面的博客中已提到,执行该语句后,res[0] 就是 SQL 语句查询到的 path ,根据源代码,path 就是传入的文件名
    res = cur.fetchone()
    if res is None:
        return "File not found", 404

    # print(res[0])
# os.path.join 函数拼接路径,再 open 打开文件
    with open(os.path.join("uploads/", res[0]), "r") as f:
        return f.read()

os.path.join 绝对路径拼接

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

但是该函数有个特性:如果拼接的某个路径以 / 开头,那么包括基础路径在内的所有前缀路径都将被删除,该路径将被视为绝对路径。下面的示例揭示了开发者可能遇到的这个陷阱。

比如,上述代码中,若 res[0] 以 / 开头,则前面的 uploads/ 将被抹去,最后拼接的结果只有 res[0] 。

漏洞利用

据此,我们可以传入一个名为 “/flag” 的文件,那么最后经过路径拼接抹去前面的 uploads/ 路径,就会直接打开根目录下的 flag 文件。

当然,这种方法存在猜测性,前提是根目录下确实有一个 flag 文件。

文件名为 /flag ,文件内容任意:

在这里插入图片描述

返回结果中给出了路径:/file/de087626346e4fc390a272957aa5b88e ,那么直接访问:

在这里插入图片描述

拿到 flag 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1347297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你好,2024!

大家好&#xff0c;我是南城余&#xff01; 今天是2023年最后一天&#xff0c;看到各位大佬都在分享今年的总结&#xff0c;我也来做个年度总结&#xff0c;是第一次做年度总结&#xff0c;希望以后可以每年都做一个好好的回顾。 NO1. 再见&#xff0c;大学&#xff01; 1 2…

计算机毕业设计------SSM游戏点评网站

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,管理员管理,网站用户管理,游戏资讯管理,游戏类型管理,城市信息管理,竞技场管理,游戏信息管理,游戏评价信息管理等功能。…

flowable工作流看这一篇就够了(进阶篇 下)

目录 三、多人会签 3.1、多实例介绍 3.2、基本应用 案例一&#xff08;静态指定数量&#xff09; 案例二&#xff08;动态数量和指派审批人&#xff09; 案例三&#xff08;表达式方式&#xff09; 案例四&#xff08;Java方法控制完成条件&#xff09; 3.3、服务任务 …

布隆过滤器-使用原理和场景

一、概述 布隆过滤器&#xff08;Bloom Filter&#xff09;主要用来检索一个元素是否在一个集合中。它是一种数据结构bitMap,优点是高效的插入和查询&#xff0c;而且非常节省空间。缺点是存在误判率和删除困难。 二、应用场景 1、避免缓存穿透&#xff0c;当redis做缓…

穿越时光的镜头:2023回顾与2024展望

前言 2023 年就像一本充满着惊喜和挑战的书籍&#xff0c;它的每一页都留下了我生活中不同的痕迹。回顾过去&#xff0c;我发现了许多意想不到的成长和启示&#xff0c;也体验了生活的起起伏伏。 这篇文章是对 2023 年的一个小小总结&#xff0c;也是对未来的一点期许。在这里…

训狗技术从初级到高级,专业有效的训狗训犬教程

一、教程描述 现在大部分人家里都会养些宠物&#xff0c;比如狗狗&#xff0c;虽然狗狗的一些行为习惯跟遗传有关&#xff0c;但是主人后天的影响也会给狗狗带来改变&#xff0c;本套教程教你纠正狗狗的不良行为&#xff0c;可以让你与狗愉快地玩耍。本套训狗教程&#xff0c;…

二叉树的后序遍历,力扣

目录 建议先刷一下中序遍历 题目地址&#xff1a; 题目&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 注&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 代码实现&#xff08;递归&#xff09;&#xff1a; 代码实现&#x…

linux go环境安装 swag

下载依赖包 go get -u github.com/swaggo/swag编译 移动到下载的go-swagger包目录,一般在$GOPATH/pkg/mod下 查看 GOPATH echo $GOPATHcd /root/GolangProjects/pkg/mod/github.com/swaggo/swagv1.16.2go install ./cmd/swag/不出意外&#xff0c;$GOPATH/bin下 已经有了sw…

Vue.js和Node.js的关系--类比Java系列

首先我们看一张图 这里我们类比了Java的jvm和JavaScript的node.js。 可以看到&#xff0c;node.js是基础&#xff0c;提供了基础的编译执行的能力。vue,js是实际上定义了一种他自己的代码格式&#xff0c;以加速开发。

OSPF ROUTER-ID-新版(15)

目录 整体拓扑 操作步骤 1.INT 验证Router-ID选举规则 1.1 查看路由器Router-ID 1.2 配置R1地址 1.3 查看R1接口信息 1.4 查看R1Router-ID 1.5 删除接口IP并查看Router-ID 1.6 手工配置Router-ID 2.基本配置 2.1 配置R1的IP 2.2 配置R2的IP 2.3 配置R3的IP 2.4 配…

easyrecovery软件2024免费版电脑文件数据恢复工具

easyrecovery怎么恢复文件?大家可以参考下文easyrecovery恢复文件步骤来操作&#xff0c;easyrecovery是一款很强大的数据恢复软件&#xff0c;那么我们该如何使用这款软件呢?一起来了解吧&#xff01; 一&#xff1a;EasyRecovery Professional 是一款非常不错的数据恢复软件…

用通俗易懂的方式讲解大模型:一个强大的 LLM 微调工具 LLaMA Factory

LLM&#xff08;大语言模型&#xff09;微调一直都是老大难问题&#xff0c;不仅因为微调需要大量的计算资源&#xff0c;而且微调的方法也很多&#xff0c;要去尝试每种方法的效果&#xff0c;需要安装大量的第三方库和依赖&#xff0c;甚至要接入一些框架&#xff0c;可能在还…

【华为OD机试真题2023CD卷 JAVAJS】测试用例执行计划

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 测试用例执行计划 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 某个产品当前迭代周期内有N个特性()需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其ID作为下标进行标识。 设计了M个测试用…

vue3+ts开发干货笔记

总结一下在vue3中ts的使用。当篇记录部分来自于vue官网&#xff0c;记录一下&#xff0c;算是加深印象吧。 纯干笔记&#xff0c;不断补充&#xff0c;想到什么写什么&#xff0c;水平有限&#xff0c;欢迎评论指正&#xff01; 类型标注 props <script setup lang"…

Armpro脱壳软件搭建教程附源代码

PHP8.0版本&#xff0c;数据库8.0版本 1.配置注册机文件&#xff0c;打开将arm.zip/res目录下&#xff0c;mt管理器搜索将其全部修改为你自己的域名或者是服务器IP 2.然后建立数据库 数据库账号arm 数据库用户名arm 数据库密码EsZfXY4tD3h2NNA4 3.导入数据库 4.配置Redi…

优化模型:matlab多目标规划

一、多目标规划 1.1 多目标规划的定义 多目标规划&#xff08;Multi-Objective Programming&#xff0c;MOP&#xff09; 是数学优化中的一类问题。与单目标规划不同&#xff0c;多目标规划有多个目标函数需要优化&#xff0c;这些目标函数通常是相互矛盾的。多目标规划的目标…

边界判断缺失

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

android开发调用百度地图api实现加载地图和定位

目录 一.踩的一些坑以及解决方法 1.权限声明不要少 2.地图初始化 3.定位问题 &#xff08;1&#xff09;监听器注册 &#xff08;2&#xff09;定位监听器类MyLocationListener的实现 &#xff08;3&#xff09;定位功能的调用 4.android studio连接真机调试问题 二.…

C语言函数篇——strcat()函数

strcat()函数介绍&#xff1a; strcat()函数是C语言中用于连接两个字符串的函数。它将第二个字符串连接到第一个字符串的末尾&#xff0c;并返回第一个字符串的地址。 strcat()函数的语法&#xff1a; char *strcat(char *dest, const char *src); 其中&#xff0c;dest是目标…

pytorch03:transforms常见数据增强操作

目录 一、数据增强二、transforms--Crop裁剪2.1 transforms.CenterCrop2.2 transforms.RandomCrop2.3 RandomResizedCrop2.4 FiveCrop和TenCrop 三、transforms—Flip翻转、旋转3.1RandomHorizontalFlip和RandomVerticalFlip3.2 RandomRotation 四、transforms —图像变换4.1 t…