当前位置: 首页 > 后端技术 > Python

Flasksend_file函数引起的绝对路径遍历

时间:2023-03-26 16:17:22 Python

我平时接触的python项目很多,对python代码审计也没有接触过。偶然有朋友发来一个漏洞Flasksend_file函数导致的绝对路径遍历,感觉打开了新世界的大门,所以站在初学者的角度,再来分析一下。send_file的妙用在使用flask框架开发的系统中,为了直接实现用户访问某个URL时可以下载文件,我们使用send_file实现fromflaskimportFlaskfromflaskimportsend_fileapp=Flask(__name__)@app.route('/download')defdownloadFile():path="test.txt"returnsend_file(path)if__name__=='__main__':app.run()我们看到这个操作的效果是直接返回文件内容,浏览器不识别为文件下载。如果想让浏览器识别为文件下载,只需添加as_attachment=TruefromflaskimportFlaskfromflaskimportsend_fileapp=Flask(__name__)@app.route('/download')defdownloadFile():path="test.txt"returnsend_file(path,as_attachment=True)if__name__=='__main__':app.run()   当下载的文件名为中文时fromflaskimportFlaskfromflaskimportsend_fileapp=Flask(__name__)@app.route('/download')defdownloadFile():path="test.txt"returnsend_file(path,as_attachment=True)if__name__=='__main__':app.run()Content-Disposition:  Content-Disposition复制代码  在常规的HTTP响应中,Content-Disposition响应头指明了响应的内容应该以什么形式显示,是内联的(即网页还是页面的一部分),还是下载保存本地作为附件。可以是inline(默认值,所以可以不指定)或者attachment,表示附件。浏览器看到这个值会弹出一个确认框,保留文件,或者像chrome一样直接下载。  【----求助网络安全学习,以下所有学习资料添加vx:yj009991,备注“想到”即可!】①网络安全学习成长路径思维导图②60+经典网络安全工具包③100+SRC漏洞分析报告④150+在线安全攻防实战技术电子书⑤最权威的CISSP认证考试指南+题库⑥1800多页CTF实战技巧手册⑦网络安全公司最新面试题(含答案)合集⑧APP客户端安全检测指南(Android+IOS)漏洞分析漏洞是在send_file中触发的,我们跟进看看flask.helpers。send_file继续跟进检查werkzeug.utils.send_file并尝试在本地构造一个简单的语句>>>importos.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获取不受信任的输入时,目录遍历攻击是可能的。漏洞复现我们在本地构造一个简单的代码进行测试,从flaskimportFlask获取参数filename,requestfromflaskimportsend_fileapp=Flask(__name__)@app.route('/download')defdownloadFile():filename=request.args.get('filename')returnsend_file(filename,as_attachment=True)if__name__=='__main__':app.run()通过控制filename为绝对路径实现目录遍历漏洞  这个漏洞很有意思.该漏洞的修复是使用flask.safe_join加入不受信任的路径或将flask.send_from_directory调用替换为flask.send_file调用。  这个漏洞很简单,但是github上很多用python开发的项目都用到了这个函数。如果不固定,会造成很大的危害。 更多网络安全技能在线实战练习,请点击这里>> 更多网络安全工具和学习资料,扫码免费获取: