今天,来谈谈关于文件上传漏洞。
很多网站都提供了文件上传功能,用以用户来分享自己的东西。但是,这也给网站带来很大的安全隐患,如果网站管理人员或者开发人员不注意的话,将使网站处于非常危险的状态。
常见的不安全因素主要有以下两方面:
对上传文件大小不做限制
我们一般在需要上传文件的网站上,都可以看到对上传文件的大小的限制,如不能超过多少KB或多少MB,这样做的目的主要有以下两个方面考虑:大文件的上传会大量占用服务器宝贵的网络资源,大大降低系统吞吐量
大文件浪费系统存储资源,既占用大量磁盘空间,同时在存取时也将极大消耗系统磁盘I/O
对上传文件类型不做限制
上传的文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行
上传文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为(其他通过类似方式控制策略文件的情况类似)
上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行
上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
下面就说说预防漏洞的方法:
1.根据业务具体情况,相应的限制用户上传文件的大小
一方面,我们可以在前端限制用户上传文件的大小:
下面是JS获取文件大小的方法:
<INPUT TYPE="file" NAME="file" SIZE="30" onchange="getFileSize(this.value)">
<script type="text/javascript">
function getFileSize(filePath)
{
var fso = new ActiveXObject("Scripting.FileSystemObject");
alert("文件大小为:"+fso.GetFile(filePath).size);
}
</script>
当然,前端的限制只是起一个提醒作用,后端的校验当然是必不可少的,而且真正起作用的是后端。
由于后端所使用的语言不同,上传方式不同,从而判断方法不同,我使用的是servlet自带的文件上传组建,对文件大小设置是这样的:
@MultipartConfig(maxFileSize = 1024 * 1024 * 5) //5MB
//判断文件是否超过设置的大小
if(config.maxRequestSize() == -1L || config.maxFileSize() == -1L) {
System.out.println("上传文件过大!");
}
2.根据业务情况,限制用户上传文件的类型
在windows下,一般是通过后缀名来判断文件的类型的,但是我们也深知这种方式是非常不靠谱的,因为我们可以轻松的将一个后缀名改成另一个后缀名。但是许多文件都有这样的规律,在文件的开头几个字节是固定的,通过这几个字节,我们基本可以确定文件类型,我们将这几个字符称之为魔数。关于魔数,请猛戳这里
在Linux下,我们可以使用hexedit命令来以16进制查看文件内容
PNG文件:
PNG文件魔数为:89504E47
PDF文件:
PDF文件魔数为:255044462D312E
下面是常见文件的魔数:
JPEG (jpg) 文件:FFD8FF
PNG (png) 文件:89504E47
GIF (gif) 文件:47494638
TIFF (tif) 文件:49492A00
Wave (wav) 文件:57415645
AVI (avi) 文件:41564920
XML (xml) 文件:3C3F786D6C
HTML (html) 文件:68746D6C3E
ZIP (zip) 文件:504B0304
RAR (rar) 文件:52617221
Windows Bitmap (bmp) 文件:424D
MS Word/Excel (.xls or .doc) 文件:D0CF11E0
Adobe Acrobat (pdf) 文件:255044462D312E
因此我们可以通过辨别文件头部的几个字节来判断文件类型,这样就能比较准确的判断文件类型,从而严格控制文件上传,防止上传恶意文件。
关于怎样通过代码实现对文件类型判定,请点击这里:http://blog.csdn.net/t894690230/article/details/51242110