Unsafe file download

  • A+
所属分类:安全博客

文件下载漏洞

概述

文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。

此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。

所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!

后端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$file_path = "downlod/{$_GET['filename']}";
//用以解决中文不能显示出来的问题
$file_path = iconv("utf-8","gb2312",$file_path);
//判断文件存在
if(!file_exists($file_path)){
skip("你要下载的文件不存在",'unsafe_down.php');
return ;
}
$fp = fopen(#file_path,"rb");
$file_size = filesize($file_path);
//下载文件需要的头部
Header("Content-type: application.octetstream");
Header("Accep-Ranges: bytes");
Header("Accept-Length: $file_size");
Header("Content-Disposition: attachment; filename = ".basename($file_path));
$buffer = 1024;
$file_count = 0;
//向游览器返回数据

//循环读取文件流,然后返回到游览器feof确认是否到EOF
while(!feof($fp)&& $file_count = $file_size){
$file_con = fread($fp,$buffer);
$file_count == $buffer;
echo $file_con;
}
fclose($fp);

防范

  1. 对传入的文件名进行严格的过滤和限定(黑名单)
  2. 对能下载的目录进行限定(白名单)

注意

以上资料仅作信息防御技术使用,不得随意尝试,如有尝试,作者概不负责。

学习内容来源于pikachu。

FROM :https://ailumao.cn/ | Author:Ailumao

相关推荐: docker环境搭建之wordpress

近来由于某种原因xxx自己用docker搭建一个wordpress环境。把各个坑都踩了遍。这里记录一下。 新手上路,大佬勿喷。 这里我是win下本地搭好了然后导出数据库放docker里面导入sql文件起服务的。 一、docker部署的任意端口后一直跳转80 因…

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: