Flask send_file函数导致的绝对路径遍历

news2024/10/1 23:44:02

平时接触到的 python 项目并不多,对 python 的代码审计更是没有接触,偶然朋友发来了一个漏洞 Flask send_file函数导致的绝对路径遍历 ,感觉打开了新世界的大门,于是就以一个初学者的角度,进行复现分析一下。详情也可以根据 Python : Flask Path Traversal Vulnerability 进行分析学习

send_file 的妙用

 在以 flask 框架开发的系统中,为了直接实现用户访问某一个 URL 时就可以下载到文件,我们就使用 send_file 来实现


from flask import Flask
from flask import send_file

app = Flask(__name__)


@app.route('/download')
def downloadFile():
    path = "test.txt"
    return send_file(path)


if __name__ == '__main__':
    app.run()

 

我们看到 如此运行的效果是直接返回了文件的内容,浏览器并没有识别成一个文件下载下来。

要想让浏览器识别成为文件下载的话,只需要加上as_attachment=True

from flask import Flask
from flask import send_file

app = Flask(__name__)


@app.route('/download')
def downloadFile():
    path ="test.txt"
    return send_file(path, as_attachment=True)


if__name__=='__main__':
    app.run()

 

 当下载的文件名是中文时

from flask import Flask
from flask import send_file

app = Flask(__name__)


@app.route('/download')
def downloadFile():
    path ="测试.txt"
    return send_file(path, as_attachment=True)


if__name__=='__main__':
    app.run()

Content-Disposition:

 Content-Disposition

 在常规的 HTTP 应答中,Content-Disposition 响应头指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地。其可以是inline(默认值,所以可以不指定)或者是attachment,attachment表示附件,浏览器看到这个值一般会弹出一个保持文件的确认框,或者像chrome直接下载。

 

 

漏洞分析

 漏洞的触发是在 send_file 中,我们跟进看一下

 flask.helpers.send_file

 

 继续跟进查看

 werkzeug.utils.send_file

 

 我们在本地构造一个简单的语句进行尝试

>>>import os.path>>> _root_path ="path/to/mySafeStaticDir">>> path_or_file ="/../../../../../../../etc/passwd">>> os.path.join(_root_path,path_or_file)'/../../../../../../../etc/passwd'

 

 我们发现 os.path.join 使用不受信任的输入调用时不安全的。当 os.path.join 调用遇到绝对路径时,它会忽略在该点之前遇到的所有参数并开始使用新的绝对路径。当参数可控时,我们控制恶意参数输入绝对路径,os.path.join 会完全忽略静态目录。所以,当 os.path.join 来获取来自 flask.send_file 的不受信任的输入时,可能会目录遍历攻击。

漏洞复现

 我们在本地构造简单的代码进行测试,获取从外部传入的参数 filename

from flask import Flask, request
from flask import send_file

app = Flask(__name__)


@app.route('/download')
def downloadFile():
    filename = request.args.get('filename')
    return send_file(filename, as_attachment=True)

if__name__=='__main__':
    app.run()

 通过控制 filename 为绝对路径,就实现了目录穿越漏洞

 

 

 

总结反思

这个漏洞非常的有趣,漏洞的修复是可以使用flask.safe_join加入不受信任的路径或用flask.send_file调用替换flask.send_from_directory调用。

这个漏洞虽然很简单,但是在 github 上很多用 python 开发的项目都用了这个函数,如果不加以修复,会造成很大的危害。

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

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

相关文章

算法:回溯算法套路总结

目录 1、回溯算法最初的模板 2、收获节点包括剪枝、去重等操作需要在模板上加上什么东西 2.1 收获的是否为叶子节点 2.1.1 收获的是叶子节点的数据 2.1.2 收获的节点不是叶子节点的数据 2.2 能否重复选取数据 2.2.1 不能重复选取数据 2.2.2 可以重复选取数据 2.3 剪枝…

Yolov8涨点技巧:BIFPN,加权双向特征金字塔网络,对小目标涨点显著

论文:https://arxiv.org/abs/1911.09070 🏆🏆🏆🏆🏆🏆Yolov8魔术师🏆🏆🏆🏆🏆🏆 ✨✨✨魔改网络、复现前沿论文,组合优化创新

[pgrx开发postgresql数据库扩展]7.返回序列的函数编写(3)多行表序列

前文再续,书接上一回。 上一回我们解析了如何通过pgrx编写srf,返回一个TableIterator,但是在具体应用的时候,我们还是针对一条记录返回了一行数据(多个字段的一行,也还是一行),并没…

麒麟V10系统arm版安装g++时,发现的问题及解决方法

在麒麟V10系统,安装Qt时,发现没有g,打算安装一个 1. 用命令直接安装(需要连网) sudo apt-get install g 运行后出现报错:暂不能解析域名 若出现其他问题:https://www.5axxw.com/questions/simple/g7yvfq 2. 为解决报…

朝天椒USB Server登场!EastFax USB Server品牌重塑正式启动

EastFax USB Server是复园科技旗下的第三款toB技术服务产品,诞生于2019年,旨在帮助企业实现加密狗、Ukey、网银U盾等USB的远程调用,拔除卡在数字化转型齿轮里的“USB无法上云”的小石子。 EastFax USB Server的名称直接来自复园科技在十八年…

AIGC 综述 2023:A History of Generative AI from GAN to ChatGPT

GAI:发展历史,核心技术,应用领域以及未来发展 摘要1、引言1.1、主要贡献1.2、组织结构 2、生成式AI的发展历史2.1、NLP领域的发展2.2、CV领域的发展2.3、CV与NLP的融合 3、AIGC的核心技术基础3.1、经典基础模型3.1.1、Transformer3.1.2、Pre-…

面试十分钟不到就被赶出来了,问的实在是太变态了...

从外包出来,没想到算法死在另一家厂子 自从加入这家公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到8月一纸通知,所有人不许加班,薪资直降30%,顿时有吃不起饭的赶脚。 好在有个兄弟内…

8年开发经验,浅谈 API 管理

随着信息化飞速增长的还有各信息系统中的应用接口(API),API作为信息系统内部及不同信息系统之间进行数据传输的渠道,其数量随着软件系统的不断庞大而呈指数型增长,如何管理这些API已经在业界变得越来越重要&#xff0c…

网络管理 - OSPF 动态路由协议

文章目录 1 概述1.1 五种报文1.2 运行原理1.3 区域概念1.4 状态1.5 身份 2 实验配置2.1 网络拓扑图2.2 配置命令 3 扩展3.1 网工软考真题 1 概述 #mermaid-svg-EOOBZo0uztmJLHOT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#m…

强化学习:贝尔曼最优公式

策略改进案例 强化学习的目的是寻找最优策略。其中涉及两个核心概念最优状态值和最优策略,和一个工具:贝尔曼最优公式。   首先,我们给出一个熟悉的例子,了解贝尔曼方程是如何改进策略的。 根据给出的策略,我们很容…

jsonpath 语法介绍

文章目录 前言 一、对jsonpath的理解 二、补充 三、哪里可以用的到呢? 总结 前言 在使用Python做接口测试中需要获取json中的字段值,因此需要使用jsonpath里面的提取规则,所以特意学习了jsonpath中的语法。 一、对jsonpath的理解 在线运…

ZigBee案例笔记 - 定时器

文章目录 1.片内外设I/O2.定时器简介3.定时器1寄存器4.定时器1操作自由运行模式模模式正计数/倒计数模式 5.16位计数器定时器1控制LED 示例 6.定时器3概述自由运行模式倒计数模式模模式正/倒计数模式 7.定时器3寄存器定时器3控制LED闪烁 1.片内外设I/O 定时器这样的片内外设也…

微信小程序原生开发功能合集十五:个人主页功能实现

本章个人主页功能实现,展示当前登录用户信息、个人主页、修改密码、浏览记录、我的收藏、常见问题、意见反馈、关于我们等界面及对应功能实现。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如…

django ORM框架 第四章 聚合函数

上一章:django ORM框架 第三章 关联表的数据创建与查询_做测试的喵酱的博客-CSDN博客 一、聚合函数类型: from django.db.models import Q, Count, Avg, Max, Min 班级表: 学生信息表: 1.1 Count 模版: QuerySet.…

如何将m4a音频转换mp3格式,5种简单方法帮你处理

如何将m4a音频转换mp3格式?这个问题想必在工作生活中经常遇到吧。为什么要将m4a音频转换mp3格式呢?首先,M4A是一种较新的高质量音频文件格式,通常用于存储高保真度的音频文件,例如音乐录音室的原始录制。但是&#xff…

基于C#制作一个ChatGPT桌面助手

基于C#制作一个ChatGPT桌面助手,在工作或者学习时提升自己的效率,工欲善其事,必先利其器。 一、前言1.1、什么是ChatGPT1.2、ChatGPT官网及key申请 二、后台项目2.1、项目创建2.2、界面设置2.3、获取版本2.4、发送信息 一、前言 1.1、什么是…

深度学习实战31-开发基于机器学习的在线图像识别工具

大家好,我是微学AI,今天给大家讲一下深度学习实战31-开发基于机器学习的在线图像识别工具,本文开发一个基于机器学习的在线图像识别工具,用户可以上传一张图片,并得到对应的标签或分类信息。该工具应该支持多种图像类型,例如自然风景、动物、物品等,并且在处理复杂图像时…

面向移动机器人的道路环境感知

分享嘉宾 | 范睿 文稿整理 | William 自动驾驶感知 首先,三维几何模型背后的机理是多视图几何学,多视图几何学是指想要得到对应模型的三维几何架构,则必须要用相机在两个不同的位置进行拍照。如图1,可以通过利用两个相机在不同位…

【HarmonyOS】【JS】小白的鸿蒙学习之路2--小小的图片啊,动呀动起来

【关键字】 image组件、动画 【介绍】 今天和大家分享下,我在官网上学习的一篇Codelab。这篇帖子通过一个代码示例,实现image组件的平移、缩放、旋转和透明度变化效果。话不多说,我们一起学起来吧! 【成果展示】 【开发步骤】 …

FE_VUE路由 细致解读router/index.js的配置

1 安装vue-router插件 安装vue-router,命令:npm i vue-router 【npm i vue-router3】,在main.js 中引入路由文件: import router from ./router, 注意router 不要变且为小写;注册路由(因为main…