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

VSole2022-07-18 15:38:08

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

send_file 的妙用

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

from flask import Flaskfrom 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 Flaskfrom 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 Flaskfrom 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, requestfrom 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 开发的项目都用了这个函数,如果不加以修复,会造成很大的危害。

flask绝对路径
本作品采用《CC 协议》,转载必须注明作者和本文链接
平时接触到的 python 项目并不多,对 python 的代码审计更是没有接触,偶然朋友发来了一个漏洞 Flask send_file函数导致的绝对路径遍历 ,感觉打开了新世界的大门,于是就以一个初学者的角度,进行复现分析一下。
MTCTF-2022 部分WriteUp
2022-11-23 09:35:37
MTCTF 本次比赛主力输出选手Article&Messa&Oolongcode,累计解题3Web,2Pwn,1Re,1CryptoWeb★easypickle题目给出源码:。import base64import picklefrom flask import Flask, sessionimport osimport random. @app.route('/')def hello_world(): if not session.get: session['user'] = ''.join return 'Hello {}!\x93作用同c,但是将从stack中出栈两元素分别导入的模块名和属性名:此外对于蓝帽杯WP还存在一个小问题,原题采用_loads函数加载pickle数据但本题是loads,在opcodes处理上会有些微不通具体来说就是用loads加载时会报错误如下:对着把传入参数换成元组就行,最终的payload如下
1、文档连接钓鱼 1)LINK链接钓鱼 2)LINK快捷方式钓鱼 3)CHM文档钓鱼 CHM文档bypass waf 4)HTA钓鱼 5)宏钓鱼 宏钓鱼 bypass waf 6)OLE(Object Linking and Embedding,对象链接与嵌入) 7)嵌入JS元素 8)利用模板文件注入宏指令 9)CVE 2、伪造界面钓鱼 1)PPT动
之前有看到goby反制和松鼠A师傅蚁剑反制的文章,再想到之前写过sqlmap的shell免杀,觉得思路其实差不多,就写一篇sqlmap的反制吧。
服务器的相关信息(真实ip,系统类型,版本,开放端口,WAF等) 网站指纹识别(包括,cms,cdn,证书等),dns记录 whois信息,姓名,备案,邮箱,电话反查(邮箱丢社工库,社工准备等) 子域名收集,旁站,C段等 google hacking针对化搜索,pdf文件,中间件版本,弱口令扫描等 扫描网站目录结构,爆后台,网站banner,测试文件,备份等敏感文件泄漏等 传输协议,通用漏洞,ex
前言最近一段时间在研究Android加壳和脱壳技术,其中涉及到了一些hook技术,于是将自己学习的一些hook技术进行了一下梳理,以便后面回顾和大家学习。主要是进行文本替换、宏展开、删除注释这类简单工作。所以动态链接是将链接过程推迟到了运行时才进行。
避免网站显示SQL错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
⽹上整理的⾯试问题⼤全,有些 HW ⾯试的题,已经收集好了,提供给⼤家。
apache一些样例文件没有删除,可能存在cookie、session伪造,进行后台登录操作
漏洞原因 服务器模板注入 是一种利用公共 Web 框架的服务器端模板作为攻击媒介的攻击方式,该攻击利用了嵌入模板的用户输入方式的弱点。SSTI 攻击可以用来找出 Web 应用程序的内容结构。漏洞复现 /vulhub/flack/ssti //进入到ssti的目录下 up -d && docker-compose build // 加载环境并运行3.然后在浏览器上访问http://your-ip:80004、访问http://your-ip/?name={{233*233}},得到54289,说明SSTI漏洞存在。
VSole
网络安全专家