概述
使用Flask的Sample写了个文件上传Demo,模拟下文件上传%00截断
上传代码如下(注释掉文件名称的安全过滤方法,保留了文件后缀名校验)
正常情况下,后缀名为.py的文件是不能上传的,出现如下情况:
但因为应用服务器是windows,可以使用%00截断绕过
1-修改tt.py的名称为tt.py%00.jpg,重新上传,使用burpsuite拦截上传请求,并将%00做URL-Decode
2-释放请求,可以看到文件上传成功
文件上传,应该怎样做
1-后端安全过滤文件名称,去除特殊符号或标志(.. %00 等等),极端的话完全重命名,使用其他方式记录安全过滤后文件名称(如果有必要)
2-后端判断安全过滤后名称的后缀
3-更严格的话,可以读取文件,根据文件头特征再次判断文件类型
4-再保险可以存储文件到数据库中