[NISACTF 2022]babyupload

[NISACTF 2022]babyupload wp

信息搜集

进入页面:

在这里插入图片描述

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

在源码中发现提示,存在 ./source 路径:

在这里插入图片描述

访问该路径得到源码:

from flask import Flask, request, redirect, g, send_from_directory
import sqlite3
import os
import uuidapp = 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!", 403conn = db()cur = conn.cursor()uid = uuid.uuid4().hextry: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 模块以某种方式生成文件的 uiduid = uuid.uuid4().hextry: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 查找 pathcur.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.mzph.cn/news/587590.shtml

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

相关文章

《深入理解C++11:C++11新特性解析与应用》笔记六

第六章 提高性能及操作硬件的能力 6.1 常量表达式 6.1.1 运行时常量性与编译时常量性 大多数情况下&#xff0c;const描述的是运行时常量性&#xff0c;也即是运行时数据的不可更改性。但有时候我们需要的却是编译时的常量性&#xff0c;这是const关键字无法保证的。例如&am…

精品Nodejs实现的在线菜谱食谱美食学习系统的设计与实现

《[含文档PPT源码等]精品Nodejs实现的在线菜谱学习系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Windows…

day5--java基础编程:异常,内部类

6 异常 6.1 异常概述 出现背景&#xff1a; 在使用计算机语言进行项目开发的过程中&#xff0c;即使程序员把代码写得尽善尽美&#xff0c;在系统的运行过程中仍然会遇到一些问题&#xff0c;因为很多问题不是靠代码能够避免的&#xff0c;比如:客户输入数据的格式&#xff0c…

技术博客官网也是一个不错的学习平台(第411篇)

技术博客官网也是一个不错的学习平台(第411篇) 今天的主题是OSPF 大纲 技术成就梦想51CTO-中国知名的数字化人才学习平台和技术社区 OSPF 概念型问题_wx655f0abb3511b的技术博客_51CTO博客 OSPF协议介绍及配置 - airoot - 博客园 (cnblogs.com) 一、OSPF概述 回顾一下距离矢…

图片处理软件,批量缩放图片尺寸

无论是社交媒体上的分享&#xff0c;还是工作中的图片素材&#xff0c;往往大小不一、形状不同&#xff0c;这时如何批量高效地对这些图片进行缩放就显得尤为重要。传统的图片处理软件&#xff0c;不仅操作复杂&#xff0c;而且处理速度慢&#xff0c;更无法实现批量化处理。但…

《Spring Cloud学习笔记:微服务保护Sentinel + JMeter快速入门》

Review 解决了服务拆分之后的服务治理问题&#xff1a;Nacos解决了服务治理问题OpenFeign解决了服务之间的远程调用问题网关与前端进行交互&#xff0c;基于网关的过滤器解决了登录校验的问题 流量控制&#xff1a;避免因为突发流量而导致的服务宕机。 隔离和降级&#xff1a…

【LeetCode:17. 电话号码的字母组合 | 递归 + 回溯 + 组合】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

计算机网络【DNS】

DNS 基本概述 与 HTTP、FTP 和 SMTP 一样&#xff0c;DNS 协议也是应用层的协议&#xff0c;DNS 使用客户-服务器模式运行在通信的端系统之间&#xff0c;在通信的端系统之间通过下面的端到端运输协议来传送 DNS 报文。但是 DNS 不是一个直接和用户打交道的应用。DNS 是为因特…

【损失函数】SmoothL1Loss 平滑L1损失函数

1、介绍 torch.nn.SmoothL1Loss 是 PyTorch 中的一个损失函数&#xff0c;通常用于回归问题。它是 L1 损失和 L2 损失的结合&#xff0c;旨在减少对异常值的敏感性。 loss_function nn.SmoothL1Loss(reductionmean, beta1.0) 2、参数 size_average (已弃用): 以前用于确定是…

从PDF中提取图片

由于工作需要&#xff0c;要从pdf文件中提取出图片保存到本地&#xff0c;项目中就引用到了Apache PDFBox库。 1 什么是Apache PDFBox? Apache PDFBox库&#xff0c;一个用于处理PDF文档的开源Java工具。它允许用户创建全新的PDF文件&#xff0c;操作现有的PDF文档&#xff0…

利用ufun对部件进行操作(新建、打开、保存、另存、关闭等)

一、概述 在NX二次开发中我们常常会用到新建、打开、保存、另存为和关闭命令&#xff0c;这些函数一般放在UF_part.h头文件下&#xff0c;下面针对以上有关功能结合案例进行说明。 二、功能函数结合案例说明 2.1新建文件创建块保存功能 1&#xff09;NXOpenC代码 #include …

4.32 构建onnx结构模型-Erf

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Erf 结点进行分析 方式 方法一&…

抖音详情API:从零开始构建抖音应用

随着短视频的兴起&#xff0c;抖音已经成为了一个全球范围内的热门平台。对于开发人员而言&#xff0c;利用抖音详情API从零开始构建抖音应用具有巨大的潜力和机会。本文将为你提供从零开始构建抖音应用的指南&#xff0c;包括开发环境搭建、API请求格式、用户认证等关键环节&a…

移动硬盘打不开怎么办?没有比这更好的办法了

移动硬盘打不开是常见故障&#xff0c;可能的原因有很多&#xff0c;例如硬盘驱动器故障、文件系统损坏、分区表错误等。本文将详细分析这些原因&#xff0c;并提供相应的解决方法&#xff0c;帮助您解决移动硬盘打不开的问题。 当移动硬盘打不开时&#xff0c;为了保留其中的文…

[LitCTF 2023]Vim yyds

[LitCTF 2023]Vim yyds wp 题目页面如下&#xff1a; 搜索一番&#xff0c;没有发现任何信息。题目描述中说到了源码泄露&#xff0c;那么先进行目录扫描。 dirsearch 目录扫描 命令&#xff1a; dirsearch -u "http://node4.anna.nssctf.cn:28588/"返回结果&…

使用docker轻量化部署snmp agent(SNMPv2访问)

文章目录 服务器环境说明单机部署&#xff08;非挂载conf文件版&#xff09;debian:buster-slim容器简介实现步骤创建Dockerfile创建SNMP配置文件 (snmpd.conf)构建Docker镜像运行Docker容器 注意补充复制容器文件到本地容器、镜像操作 单机部署&#xff08;挂载conf文件版&…

12.30序列检测(重叠、不重叠、连续、不连续、含无关项)——移位寄存器,状态机;状态机(二段式,三段式)

状态机-重叠序列检测 timescale 1ns/1nsmodule sequence_test2(input wire clk ,input wire rst ,input wire data ,output reg flag ); //*************code***********//parameter S00, S11, S22, S33, S44;reg [2:0] state, nstate;always(posedge clk or negedge rst) b…

CLion Nova:全新的C/C++ IDE

CLion Nova是一款备受期待的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains专门为C/C开发者设计。这款IDE提供了许多新的功能和改进&#xff0c;使用 ReSharper C/Rider C 语言引擎而不是 CLion “传统” 引擎&#xff0c;以满足C/C开发者的需求。目前预览版…

网络层解读

基本介绍 概述 当两台主机之间的距离较远(如相隔几十或几百公里&#xff0c;甚至几千公里)时&#xff0c;就需要另一种结构的网络&#xff0c;即广域网。广域网尚无严格的定义。通常是指覆盖范围很广(远超过一个城市的范围)的长距离的单个网络。它由一些结点交换机以及连接这些…

多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测

多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测 目录 多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测预测效果基本介绍模型背景程序设计参考资料 预测效果 基本介绍 MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入…