目录
题目: Flask-File Upload
先查看源代码
<html>
<head>
<title>File Upload</title>
</head>
<body>
<form action="/uploader" method="POST" enctype="multipart/form-data">
<input type="file" name="file" accept=".jpg,.png" /> #上传的文件类型为file,只接受jpg和png
<input type="submit" />
</form>
<!-- Give me the file, and I will return the Running results by python to you! -->
# 给我一个文件,我将用Python返回你运行的结果
</body>
</html>
用pycharm来做作,新建一个目录,然后输入:
import os
os.system('ls / ')
查找该目录下的文件,并该后缀名为jpg或png,后上传
查看源代码
修改一下代码
修改文件后缀名为jpg或png,上传之后查看源码即可得到flag
详解:
(1)什么是Flask?
Flask是一个较小的Python web框架,只提供了一个强劲的核心,其他的功能都需要使用拓展来实现。意味着可以根据自己的需求量身打造,一般来说就是利用它来搭建网站。Flask的核心组件包括Werkzeug,一个WSGI工具箱,以及Jinja2,一个模板引擎。Flask使用BSD授权,这意味着它遵循开源许可证,允许用户自由地使用、修改和分发
分析:
首先对于这个有flask构建的web文件上传程序,其中包含了一个文件上传的端点 /uploader。当客户端通过 POST 请求发送文件到 /uploader 时,服务器会检查是否有文件被上传,然后将文件保存到指定的上传文件夹中。在文件保存后,os.system(' ls /') 这行代码被执行,它会在服务器上执行 ls / 命令,列出根目录下的所有文件和文件夹。
(2)代码分析:
import os # 导入os模块
os是operation system 的缩写,翻译为操作系统;
os模块的功能:文件的目录、路径的操作;进程管理;环境参数的设置;
os.getcwd 获得当前工作路径
os system() 是os模块最基本的方法,system()可将字符串转化成命令行在服务器上运行,每条system()在执行时,会创建一个子进程在系统上执行命令行,子进程的结果无法影响主进程
(3)文件上传漏洞:
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,“文件上传” 本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。